2013-03-04 136 views
1

此代碼:Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo("hu-HU"), "{0:C}", 1234.56M))將產生以下輸出:1 234,56英尺,這在技術上是正確的,但它是如何猜測貨幣?爲什麼.NET貨幣格式包含貨幣符號?

這種行爲意味着只要將顯示文化從hu-HU改變爲en-US,就會將值乘以200以上,這取決於當前的費率。您絕不會犯500美元的500福林。明顯。

設定貨幣克隆所需的文化和設置的貨幣符號的唯一的「好」辦法:

var format = NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo("en-US")).Clone() as NumberFormatInfo; 
format.CurrencySymbol = "asd"; 
Console.Out.WriteLine(string.Format(format, "{0:C}", 1234.56M)); 

這工作正確的生產asd1,234.56,但這麼多繁瑣。

我的問題是:

  1. 什麼是落後於這個全球化的世界,我們一直生活在幾十年默認爲一個國家貨幣的比例是多少?
  2. 爲什麼沒有辦法以更相關的方式指定金額和貨幣,因爲它們如此耦合?
  3. 獎勵:如果我使用sk-SK進行文化交流,我會獲得「默認」貨幣的歐元。如果我更改爲Framework 2.0,自2005年以來它應該是Sk(對於斯洛伐克克朗),它是本國貨幣。 (當然,這不會發生,但我還沒有嘗試過有不遲於2.0的任何系統上。)

UPDATE: 結論:

  1. 從文化違約貨幣是一切正常對於其他人(包括我)
  2. 沒有「金額」類型,因爲沒有長度,重量等類型,限額在哪裏? Virtlink爲此創建了一個庫:M42 Financial
+1

它顯示它,因爲你問它。如果你不需要,只需使用另一種格式說明符。像「N2」一樣。 – 2013-03-04 14:27:40

+1

您正在混淆數據的格式。如果您以錯誤的匯率或錯誤的貨幣進行匯票,而這不是格式問題。 – Paparazzi 2013-03-04 14:32:17

+1

雖然這是根據計算器規則的「非建設性」問題之一,但這是一個非常有趣的問題。 – 2013-03-04 14:34:34

回答

4

我改變了主意:我同意你的看法,貨幣是文化的一部分是很奇怪的。

這是不常用在.NET和Java中指定具有值的單位。您通常不會指定溫度,距離或貨幣單位。對於大多數意圖和目的,設備由開發人員承擔:米爲距離,攝氏爲溫度。對於給定的文化,.NET沒有默認的距離單位或溫度單位。

爲了保持一致,.NET Framework不應該將貨幣信息添加到文化中。大多數人處理多種貨幣,有些國家甚至接受多種貨幣。並非所有文化中的每個人都會使用一種貨幣。

.NET框架包含一個System.Currency類,但它是隱藏的(內部),並且僅用於Decimal.ToOACurrency()方法。它也不是很有用。自2002年以來,Java包含一個Currency類,但由於.NET Framework是在2000年創建的,許多設計錯誤都是從Java複製的,所以這可能就是其中之一。但是,我找不到有關Java類是否包含(或包含)任何貨幣信息的信息,而且我也不是通靈。

那麼,從單位從未在.NET中指定且不應該是文化的默認貨幣的觀點來看,那麼他們應該在哪裏放置貨幣單位的貨幣價值呢?當然,他們應該創建一個Currency類。


快速搜索並沒有把任何錢庫了,這樣一個實驗,我創建了一個可移植的庫與錢而工作(包括它的貨幣單位)。它工作得非常好。

您可以在這裏下載:

M42 Financial - 便攜式.NET庫與錢和貨幣工作。

如果任何人有任何建議或改進,做一個拉請求或創建一個問題

+0

......這些都是數字格式化的有效點。但如何猜測這個貨幣呢? – 2013-03-04 14:33:52

+0

你的例子在格式和內容上都有所不同。一萬歐元與一萬美元非常不同,無論他們展示的是哪種文化。我錯過了格式和內容之間的明顯區別。貨幣是內容,而不是格式。 (雖然是貨幣符號IS格式的位置) – 2013-03-04 14:38:25

+0

@StefanSteinegger貨幣符號位於指定文化的文化信息類中。 – Magnus 2013-03-04 14:40:47

-4

我不知道.NET,但是您的格式化程序是否允許您在格式字符串中忽略「M」?

所以這個:1234.56代替本1234.56M

+0

文字類型對格式沒有影響。我嘗試過不同的類型(M,D,甚至L)。 – 2013-03-04 14:26:38

+0

這不是一個格式符號。 – 2013-03-04 14:27:38

+0

'M'只是爲了聲明一個十進制常量,而不是一個double。我不認爲小數的格式不同。 – 2013-03-04 14:28:38

0

我不能說什麼,設計師們想什麼,但他們的決策做好了意義。回答您的問題:

  1. 我們大多數人和我們的客戶處理一種貨幣,這取決於我們生活的國家。默認爲該文化的默認貨幣是合理的。
  2. 貨幣符號和數字格式是單獨設置的,因爲很可能在更改貨幣符號時要保留默認數字格式。例如,如果我(在美國)以英鎊打印金額,我不希望數字格式改變 - 只是貨幣符號。如果我必須將它們都設置好,我不僅要知道新貨幣符號,還要知道我使用的具體數字格式。另外,如果它們合併,那麼更改數字格式(對於非貨幣值)也需要我指定貨幣符號。除非你有兩個完全獨立的數字格式......這隻會是瘋狂的。
  3. 對這個問題沒有答案。

簡而言之,擁有兩個獨立的設置爲您提供了更大的靈活性並使事情變得簡單。將事情結合起來可以使更多的工作單獨改變事物。

+0

使用內置貨幣處理功能,en-US應用程序不會顯示英鎊。我需要用$符號以美國格式顯示它們,使用問題中的clone()技術或實現我自己的貨幣格式。 – thelem 2014-08-04 14:16:07

2

我只是認爲這並不意味着當多種貨幣可能出現在應用程序中時使用。當你有一個簡單的應用程序來處理貨幣時,它可能是有用的,就像必須用當地貨幣解釋的數字一樣。

在所有其他情況下,請勿使用它。

我不認爲有很多這樣的應用程序是有道理的。

0

爲什麼.NET貨幣格式包含貨幣符號?

因爲它是一種貨幣格式。

+0

所以你的意思是,如果五英鎊或五歐元不重要,這只是一個演示問題。 – 2013-03-04 21:16:26

+0

真的,你期望單獨的貨幣是一個數據類型,你不能將歐元添加到美元。英鎊和千克怎麼樣? 2008年1月1日和2008年1月1日哪些日子呢?停止的地方 - SQL是否有歐元和美元的數據類型? – Paparazzi 2013-03-04 22:14:32

+0

你說得對。正如上面@Virtlink指出的那樣,尺寸或單位很少被封裝。 – 2013-03-05 13:57:24