programing

JSON에서의 통화값 포맷의 기준은 무엇입니까?

instargram 2023. 2. 21. 23:24
반응형

JSON에서의 통화값 포맷의 기준은 무엇입니까?

다양한 데이터 유형 및 현지화를 염두에 두고 웹 서비스가 애플리케이션 간에 금전적 가치를 전달하는 가장 좋은 방법은 무엇입니까?어디 기준이 있나요?

처음에 생각한 것은 숫자 타입을 사용하는 것이었습니다.예를들면

"amount": 1234.56

통화 계산에 부동소수점 데이터 유형을 사용할 때 정밀도가 떨어지고 반올림 오류가 발생하는 문제에 대해 많은 논쟁을 봐왔습니다. 그러나 우리는 단지 값을 전송하고 있을 뿐이지 계산은 하지 않기 때문에 그것은 문제가 되지 않습니다.

EventBrite의 JSON 통화 사양은 다음과 같습니다.

{
"currency": "USD", 
"value": 432, 
"display": "$4.32"
}

부동 소수점 값을 피할 수 있는 Bravo입니다. 하지만 이제 다른 문제에 부딪힙니다. 우리가 보유할 수 있는 최대 수는 얼마나 됩니까?

JSON에서는 숫자의 실장이 다르기 때문에 32비트 부호 있는 정수가 가장 좋다고 하는 코멘트도 있습니다.32비트 부호 있는 정수로 유지할 수 있는 최대값은 2147483647입니다.마이너 유닛의 값을 나타내면 21,474,836.47달러입니다.2,100만달러는 큰 수치로 보이지만, 그 이상의 값을 필요로 하는 어플리케이션도 있을 수 있습니다.문제는 1,000개의 마이너 단위가 주요 단위를 이루거나 통화가 미국 달러보다 가치가 낮은 통화에서 더 악화된다.예를 들어 튀니지 Dinar는 1,000 millim으로 나뉩니다.2147483647 millim 또는 2147483.647 TND는 $1,124,492.04입니다.경우에 따라서는 100만 달러가 넘는 가치가 적용될 수도 있습니다.또 다른 예로는 베트남 동부의 서브유닛은 인플레이션에 의해 무용지물이 되었으니 주요 유닛을 사용하자. 2147483647 VND는 98,526.55달러이다.많은 사용 사례(은행 잔액, 부동산 가치 등)가 이보다 훨씬 더 높을 것입니다.(하지만 EventBrite는 티켓 가격이 그렇게 높은 것에 대해 걱정할 필요가 없습니다!)

값을 문자열로 전달하여 이 문제를 방지하려면 문자열 형식을 어떻게 지정해야 합니까?국가/로케일마다 형식이 크게 다릅니다. 통화 기호, 기호가 금액 전후에 발생하는지 여부, 기호와 금액 사이에 공백이 있는지 여부, 쉼표 또는 마침표가 소수점을 구분하기 위해 사용되는 경우, 쉼표가 ne를 나타내기 위해 수천 개의 구분 기호, 괄호 또는 빼기 기호로 사용되는 경우입니다.어쩌면 내가 모르는 것보다 더 많을 수도 있어

앱이 어떤 로케일/통화를 사용하는지 알 수 있는 경우 다음과 같은 값을 전달합니다.

"amount": "1234.56"

액수를 올바르게 포맷할 수 있도록 앱을 신뢰해야 합니까? (또한: 소수점 값은 피해야 하며 최소 통화 단위로 지정된 값은 피해야 합니까?아니면 메이저 유닛과 마이너 유닛을 다른 속성에 표시해야 합니까?

아니면 서버에서 원시 값과 형식화된 값을 제공해야 합니까?

"amount": "1234.56"
"displayAmount": "$1,234.56"

아니면 서버가 원시 값과 통화 코드를 제공하고 앱이 포맷하도록 해야 합니까?"금액" : "1234.56" "currency Code" : "USD" 어떤 방법을 사용하든 서버와의 송수신 양방향으로 사용해야 한다고 생각합니다.

표준을 찾을 수 없습니다. 답을 알고 계십니까? 아니면 이 기준을 정의하는 리소스를 알려주실 수 있습니까?흔한 문제인 것 같아요.

이것이 최선의 해결책인지는 모르겠지만, 지금 시도하고 있는 것은 다음과 같이 소수점을 제외하고 포맷되지 않은 문자열로 값을 전달하는 것입니다.

"amount": "1234.56"

앱은 이를 쉽게 해석할 수 있다(그리고 그것을 더블, 빅데시멀, int 또는 앱 개발자가 부동소수점 산술에 가장 적합하다고 느끼는 어떤 방법으로든 변환할 수 있다.앱은 지역 및 통화에 따라 표시할 값의 형식을 지정합니다.

이 형식은 매우 부풀려진 큰 숫자, 소수점 뒤에 세 자리 숫자가 있는 숫자, 분수 값이 전혀 없는 숫자 등 다른 통화 값을 수용할 수 있습니다.

물론 앱이 이미 사용된 로케일과 통화(다른 통화, 앱 설정 또는 로컬 장치 값)를 알고 있다고 가정합니다.콜마다 지정할 필요가 있는 경우는, 다음의 옵션이 있습니다.

"amount": "1234.56",
"currency": "USD",
"locale": "en_US"

이것들을 하나의 JSON 오브젝트로 롤링하고 싶지만 JSON 피드에 여러 개의 용도가 있을 수 있으므로 통화 설정을 한 번만 지정하면 됩니다.물론 나열된 양에 따라 다를 수 있는 경우에는 다음과 같이 캡슐화하는 것이 좋습니다.

{
"amount": "1234.56",
"currency": "USD",
"locale": "en_US"
}

또 다른 논쟁의 여지가 있는 접근법은 서버가 원시량과 포맷된 양을 제공하는 것입니다(그렇다면 모두 같은 개념을 정의하는 피드에 여러 속성을 갖는 대신 개체로 캡슐화하는 것을 권장합니다).

{
"displayAmount":"$1,234.56",
"calculationAmount":"1234.56"
}

여기서는 더 많은 작업이 서버에 오프로드됩니다.또한 여러 플랫폼 및 애플리케이션 간에 번호가 표시되는 방식에 일관성을 유지하면서 조건부 테스트 등을 위해 쉽게 구문 분석할 수 있는 값을 제공합니다.

그러나 앱이 계산을 수행한 후 사용자에게 결과를 보여줘야 한다면 문제가 남습니다.표시하기 위해서는 번호 포맷이 필요합니다.이 답변의 맨 위에 있는 첫 번째 예를 사용하여 앱에 포맷을 제어하는 것이 좋습니다.

적어도 그건 제 생각입니다.이 분야에서는 확실한 베스트 프랙티스나 연구를 찾을 수 없었기 때문에 지적하지 않은 보다 나은 솔루션이나 잠재적인 함정을 환영합니다.

AFAIK, JSON에는 "통화" 표준이 없습니다. 기초적인 유형에 기초한 표준입니다.고려해야 할 점은 소수점이 없는 통화(기니안 프랑, 인도네시아 루피아)도 있고, 1000분의 1로 나눌 수 있는 통화(바레인 디나르)도 있기 때문에 소수점 두 자리라고 가정하고 싶지 않다는 것입니다.이란 레알의 경우 2백만 달러로는 멀리 갈 수 없기 때문에 정수가 아닌 복식을 다룰 필요가 있을 것 같습니다.일반적인 국제 모델을 찾고 있는 경우, 초인플레이션이 있는 국가는 100만(또는 1억)으로 나누기 위해 매년 2회 통화를 변경하기 때문에 통화 코드가 필요합니다.역사적으로 브라질과 이란은 둘 다 이런 일을 해왔다고 생각한다.

통화 코드(및 기타 유용한 정보)에 대한 참조가 필요한 경우 https://gist.github.com/Fluidbyte/2973986를 참조하십시오.

금액은 문자열로 표시되어야 합니다.

스트링을 사용하는 발상은 json을 소비하는 클라이언트는 이를 다음과 같은 10진수 타입으로 해석해야 한다는 것입니다.BigDecimal부동 소수점 부정확성을 방지합니다.

다만, 시스템의 어느 부분도 부동 소수점을 회피하고 있는 경우에만 의미가 있습니다.백엔드가 데이터만 전달하고 계산은 하지 않더라도 부동소수를 사용하면 결과적으로 (프로그램에서) 보이는 것과 (json에서) 일치하지 않게 됩니다.

또한 소스가 데이터베이스라고 가정할 때 데이터를 올바른 유형으로 저장하는 것이 중요합니다.데이터가 이미 부동 소수점으로 저장되어 있는 경우 기술적으로 부정확한 데이터를 전달하기 때문에 이후의 변환이나 캐스팅은 의미가 없습니다.

개발 포털 - API 가이드라인 - 흥미로운 제안사항을 찾을 수 있는 통화:

"price" : {
 "amount": 40,
 "currency": "EUR"
}

스트링보다 제작과 포맷이 조금 어렵지만, 저는 이것이 그것을 실현하는 가장 깨끗하고 의미 있는 방법이라고 생각합니다.

  1. 금액과 화폐를 분리하다
  2. number JSON「」라고 입력합니다.

다음은 JSON 포맷을 제시하겠습니다.https://pattern.yaas.io/v2/schema-monetary-amount.json

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "title": "Monetary Amount",
    "description":"Schema defining monetary amount in given currency.",
    "properties": {
        "amount": {
            "type": "number",
            "description": "The amount in the specified currency"
        },
        "currency": {
            "type": "string",
            "pattern": "^[a-zA-Z]{3}$",
            "description": "ISO 4217 currency code, e.g.: USD, EUR, CHF"
        }
    },
    "required": [
        "amount",
        "currency"
    ]
}

통화 형식과 관련된 또 다른 질문들은 이 관행이 기본 단위를 가진 문자열에 훨씬 가깝다는 것을 지적했습니다.

{
    "price": "40.0"
}

아마 공식적인 기준이 없을 거예요.당사 제품에는 다음과 같은 구조를 사용하고 있습니다.

"amount": {
    "currency": "EUR",
    "scale": 2,
    "value": 875
}

위의 예는 금액 €8.75를 나타냅니다.

통화는 문자열(및 값은 ISO4217에 대응해야 함)로 정의되며, scale 및 value는 정수입니다."규모"의 의미는 명백합니다.이 구조는 통화에 분수가 없거나 비표준 분수가 있는 등의 많은 문제를 해결한다.

언급URL : https://stackoverflow.com/questions/30249406/what-is-the-standard-for-formatting-currency-values-in-json

반응형