2015-05-14 25 views
14

Ghi nhớ các quirks khác nhau của các loại dữ liệu và nội địa hóa, cách tốt nhất để một dịch vụ web truyền đạt các giá trị tiền tệ đến và từ các ứng dụng là gì? Có một tiêu chuẩn nào đó không?Tiêu chuẩn để định dạng các giá trị tiền tệ trong JSON là gì?

Suy nghĩ đầu tiên của tôi là chỉ cần sử dụng loại số. Ví dụ

"amount": 1234.56 

Tôi đã thấy nhiều tranh luận về các vấn đề với một thiếu chính xác và làm tròn lỗi khi sử dụng điểm kiểu dữ liệu để tính toán tiền tệ nổi - tuy nhiên, chúng tôi chỉ truyền tải những giá trị, không tính toán, vì vậy shouldn rằng không quan trọng.

EventBrite's JSON currency specifications chỉ định một cái gì đó như thế này:

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

Bravo để tránh các giá trị dấu chấm động, nhưng bây giờ chúng tôi chạy vào một vấn đề khác: số lượng lớn nhất chúng ta có thể giữ những gì?

One comment (Tôi không biết đó là sự thật, nhưng có vẻ hợp lý) cho rằng, vì việc triển khai số khác nhau trong JSON, tốt nhất bạn có thể mong đợi là số nguyên có ký 32 bit. Giá trị lớn nhất mà số nguyên có dấu 32 bit có thể giữ là 2147483647. Nếu chúng tôi biểu thị các giá trị trong đơn vị vị thành niên, đó là $ 21,474,836,47. $ 21 triệu có vẻ như một con số khổng lồ, nhưng không thể tưởng tượng được rằng một số ứng dụng có thể cần phải làm việc với một giá trị lớn hơn. Vấn đề trở nên tồi tệ hơn với các đơn vị tiền tệ nơi 1.000 đơn vị nhỏ làm cho một đơn vị lớn, hoặc nơi tiền tệ có giá trị nhỏ hơn đô la Mỹ. Ví dụ, Dinar Tunisia được chia thành 1.000 milim. 2147483647 milim, hoặc 2147483.647 TND là $ 1,124,492.04. Thậm chí một số trường hợp có thể có giá trị hơn 1 triệu đô la trong một số trường hợp. Một ví dụ khác: các tiểu đơn vị của đồng Việt Nam đã trở nên vô dụng bởi lạm phát, vì vậy hãy sử dụng các đơn vị lớn. 2147483647 VND là $ 98,526.55. Tôi chắc chắn nhiều trường hợp sử dụng (số dư ngân hàng, giá trị bất động sản, v.v.) cao hơn đáng kể. (EventBrite có thể không phải lo lắng về giá vé cao như vậy!)

Nếu chúng ta tránh vấn đề đó bằng cách giao tiếp giá trị dưới dạng chuỗi, chuỗi nên được định dạng như thế nào? Các quốc gia/miền địa phương khác nhau có định dạng khác nhau — các ký hiệu tiền tệ khác nhau, cho dù biểu tượng xảy ra trước hoặc sau số tiền, có hay không có khoảng cách giữa ký hiệu và số tiền, nếu dấu phẩy hoặc dấu chấm được sử dụng để tách số thập phân. được sử dụng làm dấu tách hàng nghìn, dấu ngoặc đơn hoặc dấu trừ để biểu thị các giá trị âm và có thể nhiều hơn nữa mà tôi không biết.

ứng dụng nên biết những gì ngôn ngữ/tiền nó làm việc với, trao đổi các giá trị như

"amount": "1234.56" 

qua lại, và tin tưởng ứng dụng để định dạng một cách chính xác số tiền? (Ngoài ra: nên tránh giá trị thập phân và giá trị được chỉ định theo đơn vị tiền tệ nhỏ nhất? Hoặc đơn vị lớn và nhỏ được liệt kê trong các thuộc tính khác nhau?)

Hoặc máy chủ nên cung cấp giá trị thô và giá trị được định dạng?

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

Hoặc máy chủ có cung cấp giá trị thô và mã đơn vị tiền tệ và để ứng dụng định dạng không? "số tiền": "1234.56" "currencyCode": "USD" Tôi giả sử phương pháp nào được sử dụng nên được sử dụng theo cả hai hướng, truyền đến và từ máy chủ.

Tôi không thể tìm thấy tiêu chuẩn - bạn có câu trả lời hay không hoặc có thể chỉ cho tôi tài nguyên xác định điều này? Nó có vẻ như là một vấn đề phổ biến.

+1

câu hỏi liên quan: https: //stackoverflow.com/questions/45222706/what-are-the-best-practices-passing-dollar-amounts-in-json –

Trả lời

2

AFAIK, không có chuẩn "tiền tệ" trong JSON - đây là tiêu chuẩn dựa trên các loại thô sơ. Những điều bạn có thể muốn xem xét là một số loại tiền tệ không có một phần thập phân (Guinea Franc, Indonesia Rupiah) và một số có thể được chia thành nghìn (Dini Bahrain) - do đó bạn không muốn giả định hai chữ số thập phân. Đối với thực tế Iran $ 2million sẽ không giúp bạn có được đến nay vì vậy tôi mong đợi bạn cần phải đối phó với đôi không phải là số nguyên. Nếu bạn đang tìm kiếm một mô hình quốc tế chung thì bạn sẽ cần một mã tiền tệ như các quốc gia với siêu lạm phát thường thay đổi tiền tệ mỗi năm của hai để chia giá trị 1.000.000 (hoặc 100 mill). Trong lịch sử Brazil và Iran đã thực hiện điều này, tôi nghĩ vậy.

Nếu bạn cần một tài liệu tham khảo cho mã tiền tệ (và một chút thông tin tốt khác) sau đó hãy xem ở đây: https://gist.github.com/Fluidbyte/2973986

+0

Cảm ơn bạn đã suy nghĩ. Tôi đã chỉ ra một số vấn đề với một số cách tiếp cận. Những gì tôi đang tìm kiếm là thứ mà DOES làm việc. –

4

Tôi không biết nếu đó là giải pháp tốt nhất, nhưng những gì tôi đang cố gắng hiện nay là để chỉ cần vượt qua giá trị như dây đàn chưa định dạng ngoại trừ một điểm thập phân, như vậy:

"amount": "1234.56" 

ứng dụng có thể dễ dàng phân tích đó (và chuyển đổi nó sẽ tăng gấp đôi, BigDecimal, int, hoặc bất cứ phương pháp phát triển ứng dụng cảm thấy tốt nhất cho số học dấu phẩy động). Ứng dụng sẽ chịu trách nhiệm định dạng giá trị hiển thị theo ngôn ngữ và tiền tệ.

Định dạng này có thể chứa giá trị tiền tệ khác, cho dù số cao thổi phồng lớn, số với ba chữ số sau dấu thập phân, số không có giá trị phân số ở tất cả vv

Tất nhiên, điều này sẽ đảm nhận ứng dụng đã biết ngôn ngữ và tiền tệ được sử dụng (từ cuộc gọi khác, cài đặt ứng dụng hoặc giá trị thiết bị cục bộ). Nếu những cần phải được xác định cho mỗi cuộc gọi, tùy chọn khác sẽ là:

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

Tôi bị cám dỗ để cuộn này vào một đối tượng JSON, nhưng một nguồn cấp JSON có thể có nhiều tiền cho các mục đích khác nhau, và sau đó sẽ chỉ cần để chỉ định cài đặt tiền tệ một lần. Tất nhiên, nếu nó có thể thay đổi đối với từng khoản được liệt kê, sau đó nó sẽ là tốt nhất để đóng gói chúng lại với nhau, như vậy:

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

Một cách tiếp cận gây tranh cãi là cho máy chủ để cung cấp lượng thô và số tiền được định dạng. (Nếu vậy, tôi sẽ đề nghị đóng gói nó như là một đối tượng, thay vì có nhiều thuộc tính trong một thức ăn mà tất cả các định nghĩa khái niệm giống nhau):

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

Ở đây, nhiều công trình được chuyển tới máy chủ. Nó cũng đảm bảo tính nhất quán trên các nền tảng và ứng dụng khác nhau về cách các số được hiển thị, trong khi vẫn cung cấp một giá trị dễ phân tách cho thử nghiệm có điều kiện và tương tự.

Tuy nhiên, nó không có vấn đề gì - nếu ứng dụng cần thực hiện tính toán và sau đó hiển thị kết quả cho người dùng? Nó vẫn sẽ cần định dạng số để hiển thị. Cũng có thể đi với ví dụ đầu tiên ở đầu câu trả lời này và cung cấp cho ứng dụng quyền kiểm soát định dạng.

Đó là những suy nghĩ của tôi, ít nhất. Tôi đã không thể tìm thấy bất kỳ thực hành tốt nhất rắn hoặc nghiên cứu trong lĩnh vực này, vì vậy tôi hoan nghênh các giải pháp tốt hơn hoặc những cạm bẫy tiềm năng tôi đã không chỉ ra.

0

ON Dev Portal - API Guidelines - Currencies bạn có thể tìm gợi ý thú vị:

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

Đó là một chút khó khăn hơn để sản xuất & dạng hơn chỉ là một chuỗi, nhưng tôi cảm thấy đây là cách sạch nhất và có ý nghĩa để đạt được nó:

  1. số tiền và đơn vị tiền tệ không giới hạn
  2. sử dụng numberJSON loại

Đây là định dạng JSON gợi ý: 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" 
    ] 
} 

questions related to currency format Một chỉ ra đúng hay sai, mà sự tu tập là nhiều hơn nữa như một chuỗi với các đơn vị cơ sở:

{ 
    "price": "40.0" 
} 
Các vấn đề liên quan