2012-01-18 2 views
4

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

2130 -> £ 21,30
2130 -> $ 21,30
и т.д.

+1

Вы форматируете его на C# или SQL? – Blorgbeard

+1

£ 21.30 - это не то же самое, что $ 21,30, по крайней мере, не с сегодняшним коэффициентом конверсии ... Вы также храните определенную валюту со значением? – Pete

+1

C# предпочтительно с string.format –

ответ

11
int valueFromDb = 2130; 
decimal result = valueFromDb/100m; 
string formatted = result.ToString("c"); 

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

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(); 
+0

Не все культуры имеют 2 знака после запятой после цифры ... –

+1

@LeeTreveil, так как не все культуры имеют 2 десятичных знака после цифры, откуда вы знаете, глядя на значение в базе данных, где должна быть десятичная точка? Вы говорите, что 2130 может составлять 21.30, а также, возможно, 2.130 или 213.0 или 2130.00? – Nope

+0

@LeeTreveil, в этом случае вам нужно будет сохранить дополнительный столбец в своей базе данных, указывающий, какая культура использовалась при преобразовании исходного значения в целое число, чтобы вы знали, сколько нужно разделить. Как отметил Франсуа Уол, вы не можете знать это, учитывая одно целое число, такое как 2130. –

0
decimal value = ((decimal)(myNumber/100.0)); 
var result = String.Format("{0:c}", value); 
2

Вот как сделать это в C# с String.Format:

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

, которая получает вас формат для текущей культуры. More information on MSDN

0

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

decimal amount = 2130/100m; 
string output = value.ToString("C", CultureInfo.CurrentCulture); 
5
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, что явно неверно.

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

Так может быть и тот факт, что вы храните значения как целые числа процента от основного, что не относится ко всем валютам.

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

Последний из них может работать, но чреват. Остальные двое просто ошибаются.

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

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

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

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 $ 

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