Преобразовать целое число в валюту - PullRequest
4 голосов
/ 18 января 2012

У нас есть база данных, в которой хранятся числа (деньги) в базовой валюте, поэтому £ 21,30 будет храниться в базе данных как 2130.Как мне перевести это число в правильно отформатированную валюту для всех культур?

2130 -> 21,30
2130 -> 21,30
и т. Д.

Ответы [ 5 ]

11 голосов
/ 18 января 2012
int valueFromDb = 2130;
decimal result = valueFromDb / 100m;
string formatted = result.ToString("c");

Может быть быстро расширена методом:

public static class CurrencyExtensions
{
    public static string AsCurrency(this int value)
    {
        return value.AsCurrency(CultureInfo.CurrentCulture);
    }

    public static string AsCurrency(this int value, CultureInfo culture)
    {
        decimal result = value / 100m;
        return result.ToString("c", culture);
    }
}

, так что теперь вы можете быть DRYier:

int valueFromDb = 2130;
string formatted = valueFromDb.AsCurrency();
6 голосов
/ 18 января 2012
string asLocalCurrency(int intMoney)
{
  return (num / 100m).ToString("c"); //e.g. 12345 becomes €123.45 for me
}
string asSomeLocalCurrency(int intMoney, CultureInfo cInfo)
{
  return (num / 100m).ToString("c", cInfo); // e.g. 12345 with InvariantCulture is ¤123.45
}

Однако.Это означает, что £ 123,45 становится $ 123,45 или € 123,45, что явно неверно.

Тогда существует проблема, заключающаяся в том, что знак песо / доллар можно использовать для представления NIO, AUD, CAD, TOP, USD, HKD,и еще куча.Это не единственный символ, который находит применение в нескольких местах.Если вы регистрируете старые платежи, даже такие вещи, как £, которые используются для IEP и ITL (больше не используются), могут стать проблемой.

Так же как и тот факт, что вы храните значения в виде целых чисел в процентах-of-main-unit, которая применяется не ко всем валютам.

Денежная стоимость имеет смысл только с подразумеваемой или явной валютой.Здесь вы берете тот, у которого его нет, или вы заменяете подразумеваемое явным, или вы полагаетесь на очень большой кусок переопределяющей логики, чтобы все было правильно.

Последний из нихможет работать, но чревато.Два других просто неправы.

Наконец, культура в лучшем случае говорит вам, с какой валютой люди наиболее знакомы, а не то, что они всегда будут использовать.Я часто использую kroner и øre, но при их использовании я использую Hiberno-English.

Я бы рекомендовал хранить коды ISO 4217 вместе с валютами.Это хорошая идея, чтобы иметь это где-то на заключительном счете также.Символ хорош для красивости, код хорош для уточнения вещей.

Игнорировать культуру пользователя, за исключением, возможно, лучшего предположения при выборе по умолчанию.(например, если они американцы, то они , вероятно, хотят использовать доллары США, но, возможно, не хотят).В мире не так много валют, так что вот список всех, кроме нескольких специализированных случаев международного использования:

AED  United Arab Emirates Dirham  د.إ
AFN  Afghan Afghani  ؋
ALL  Albanian Lek  L
AMD  Armenian Dram  դր
ANG  Netherlands Antillean Guilder  ƒ
AOA  Angolan Kwanza  Kz
ARS  Argentine Peso  $
AUD  Australian Dollar  $
AWG  Aruban Florin  ƒ
AZN  Azerbaijani Manat  man.
BAM  Bosnia and Herzegovina Convertible Mark  KM
BBD  Barbados Dollar  $
BDT  Bangladeshi Taka  ৳
BGN  Bulgarian Lev  лв
BHD  Bahraini Dinar  .د.ب
BIF  Burundian Franc  FBu
BMD  Bermudian Dollar  $
BND  Brunei Dollar  $
BOB  Boliviano  Bs.
BRL  Brazilian Real  R$
BSD  Bahamian Dollar  $
BTN  Bhutanese Ngultrum  Nu.
BWP  Botswana Pula  P
BYR  Belarusian Ruble  Br
BZD  Belize Dollar  $
CAD  Canadian Dollar  $
CDF  Congolese Franc  FC
CHF  Swiss Franc  Fr.
CLP  Chilean Peso  $
CNY  Chinese Yuan  ¥
COP  Colombian Peso  $
CRC  Costa Rican Colon  ₡
CUC  Cuban convertible Peso  $
CUP  Cuban Peso  $
CVE  Cape Verde Escudo  $
CZK  Czech Koruna  Kč
DJF  Djiboutian Franc  Fdj
DKK  Danish Krone  kr
DOP  Dominican Peso  $
DZD  Algerian Dinar  د.ج
EEK  Estonian Kroon  kr
EGP  Egyptian Pound  ج.م
ERN  Eritrean Nakfa  Nfk
ETB  Ethiopian Birr  Br
EUR  Euro  €
FJD  Fiji Dollar  $
FKP  Falkland Islands Pound  £
GBP  Pound Sterling (British Pound)  £
GEL  Georgian Lari  lari
GHS  Ghanaian Cedi  ₵
GIP  Gibraltar Pound  £
GMD  Gambian Dalasi  D
GNF  Guinean Franc  FG
GTQ  Guatemalan Quetzal  Q
GYD  Guyanese Dollar  $
HKD  Hong Kong Dollar  $
HNL  Honduran Lempira  L
HRK  Croatian Kuna  kn
HTG  Haitian Gourde  G
HUF  Hungarian Forint  Ft
IDR  Indonesian Rupiah  Rp
ILS  Israeli New Sheqel  ₪
INR  Indian Rupee  Rs
IQD  Iraqi Dinar  د.ع
IRR  Iranian Rial  ﷼
ISK  Icelandic Króna  kr
JMD  Jamaican Dollar  $
JOD  Jordanian Dinar  JD
JPY  Japanese Yen  ¥
KES  Kenyan Shilling  Ksh
KGS  Kyrgyzstani Som  som
KHR  Cambodian Riel  ៛
KMF  Comoro Franc  CF
KPW  North Korean Won  ₩
KRW  South Korean Won  ₩
KWD  Kuwaiti Dinar  د.ك
KYD  Cayman Islands Dollar  $
KZT  Kazakhstani Tenge  ₸
LAK  Lao Kip  ₭
LBP  Lebanese Pound  ل.ل
LKR  Sri Lanka Rupee  Rs
LRD  Liberian Dollar  $
LSL  Lesotho Loti  M
LTL  Lithuanian Litas  Lt
LVL  Latvian Lats  Ls
LYD  Libyan Dinar  ل.د
MAD  Moroccan Dirham  د.م.
MDL  Moldovan Leu  leu
MGA  Malagasy Ariary  ariary
MKD  Macedonian Denar  ден
MMK  Myanma Kyat  K
MNT  Mongolian Tögrög (Tugrik)  ₮
MOP  Macanese Pataca  毫
MRO  Mauritanian Ouguiya  UM
MUR  Mauritian Rupee  R
MVR  Maldivian Rufiyaa  .ރ
MWK  Malawian Kwacha  MK
MXN  Mexican Peso  $
MYR  Malaysian Ringgit  RM
MZN  Mozambican Metical  MTn
NAD  Namibian Dollar  $
NGN  Nigerian Naira  ₦
NIO  Nicaraguan Cordoba Oro  C$
NOK  Norwegian Krone  kr
NPR  Nepalese Rupee  रू.
NZD  New Zealand Dollar  $
OMR  Omani Rial  ر.ع.
PAB  Panamanian Balboa  ฿
PEN  Peruvian Nuevo Sol  S/.
PGK  Papua New Guinean Kina  K
PHP  Philippine Peso  ₱
PKR  Pakistani Rupee  Rs
PLN  Polish Zloty  zł
PYG  Paraguayan Guaraní  ₲
QAR  Qatari Rial  ر.ق
RON  Romanian New Leu  lei
RSD  Serbian Dinar  РСД
RUB  Russian Rouble  руб
RWF  Rwandan Franc  RF
SAR  Saudi Riyal  ر.س
SBD  Solomon Islands Dollar  $
SCR  Seychelles Rupee  SRe
SDG  Sudanese Pound  SDG
SEK  Swedish Krona  kr
SGD  Singapore Dollar  $
SHP  Saint Helena Pound  £
SLL  Sierra Leonean Leone  Le
SOS  Somali Shilling  So. Sh.
SRD  Surinamese Dollar  $
STD  São Tomé and Príncipe Dobra  Db
SYP  Syrian Pound  SYP
SZL  Lilangeni  E
THB  Thai Baht  ฿
TJS  Tajikistani Somoni  TJS
TMT  Turkmenistani Manat  m
TND  Tunisian Dinar  د.ت
TOP  Tongan Paʻanga  T$
TRY  Turkish Lira  TL
TTD  Trinidad and Tobago Dollar  $
TWD  New Taiwan Dollar  $
TZS  Tanzanian Shilling  TZS
UAH  Ukrainian Hryvnia  ₴
UGX  Ugandan Shilling  Ush
USD  United States Dollar  $
UYU  Uruguayan Peso  $
UZS  Uzbekistan Som  som
VEF  Venezuelan Bolívar Fuerte  Bs. F
VND  Vietnamese Ðồng  ₫
VUV  Vanuatu Vatu  Vt
WST  Samoan Tala  WS$
XAF  CFA Franc BEAC  FCFA
XCD  East Caribbean Dollar  $
XOF  CFA Franc BCEAO  CFA
XPF  CFP Franc  F
YER  Yemeni Rial  rial
ZAR  South African Rand  R
ZMK  Zambian Kwacha  ZK
ZWL  Zimbabwe Dollar  $

О, смотрите.У Зимбабве был свой доллар в последний раз, когда я обновлялся.Что может произойти быстрее, вы удаляете его из списка, или для этого обновляется фреймворк?

2 голосов
/ 18 января 2012

Вот как это сделать в c # с помощью string.format:

decimal amount = 2130 / 100M;
string output = string.Format("{0:c}", amount);

Это дает вам формат для текущей культуры. Дополнительная информация о MSDN

0 голосов
/ 18 января 2012

Попробуйте следующее:

 decimal amount = 2130 / 100m;
 string output = value.ToString("C", CultureInfo.CurrentCulture);
0 голосов
/ 18 января 2012
decimal value = ((decimal)(myNumber / 100.0));
var result = String.Format("{0:c}", value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...