2015-05-07 96 views
1

這是我的代碼:如何防止將decimal.TryParse轉換爲「。」爲「。」?

string myValue = "0,203"; 

decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal; 

...

myValueAsDecimal is 0.203 now 

難道myValueAsDecimal有0203後TryParsedecimal內部表示始終是0.203,我需要的,如果格式化輸出GUI我需要0,203?

+1

它既沒有逗號也沒有句點,它作爲表示被存儲。 – Sayse

+1

數字的內部表示總是二元的。文字(人)表示取決於您指定的文化(或未指定)。要顯示具有特定小數點的數字,您必須將正確的文化傳遞給ToString方法或用於格式化的其他方法。要指定一個值,必須使用點作爲小數點,因爲ti是編程語言的語法。 –

+0

MIkroDel,我想補充一點,你可能不應該試圖強制用戶使用一個小數分隔符,你的應用程序應該支持他們正在使用的任何文化。用戶可能不熟悉不同的文化使用不同的小數點分隔符,絕對不會嘗試用外部分隔符輸入自己的數字 – Sayse

回答

6

難道myValueAsDecimal的TryParse

號這只是一個號碼有0203 - 它沒有一個文本格式的概念。想想更簡單的另一種方式,請考慮以下兩行代碼:

int x = 0x100; 
int y = 256; 

這兩個值是否相同?是的,他們代表相同的號碼。如果您將xy的值轉換爲字符串,默認情況下它們都會以「256」結尾 - 但如果您請求十六進制表示形式,則它們最終都可以爲「100」。

區分變量的實際值和文本表示很重要。很少有類型(我不能立即想到)帶有關於文本表示的信息 - 例如,DateTime可以從各種格式解析,但沒有原始文本格式的「內存」。這只是一個日期和時間,可以根據任何格式進行格式化。

如果需要維持的想法「的十進制數,並在它最初所代表的文化」,那麼你應該創建自己的類或結構爲配對。它不在decimal本身。

+0

這意味着要有0,203或0.203我必須使用我的GUI?例如格式輸出等。 – MikroDel

+0

@MikroDel:我不知道如何解釋你的評論,恐怕。但是,是的,如果您想區分已被解析爲相同「十進制」數字的「0,203」和「0.203」,則需要記住某些值的變化,而不是「小數」本身。儘管你想要做什麼並不完全清楚。 –

+0

根據系統的選擇文化,我在表格0,203或0.203中輸入字符串。 該輸入應該以小數形式存儲在數據庫中,並且還根據文化情況以0,203或0.203的形式顯示爲輸出。 – MikroDel

2
decimal d = 0.203m; 

Console.WriteLine(d.ToString(CultureInfo.InstalledUICulture)); 
Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));  // decimal point: dot 
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("en-US"))); // default decimal point: dot 
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("ru-RU"))); // default decimal point: comma 

結果:

0,203 
0.203 
0.203 
0,203 
+0

CurrentCulture和InstalledUICulture有什麼區別? – MikroDel

+1

你應該解釋你在這裏試圖回答什麼。 OP似乎在詢問* decimal *具有的分隔符 – Sayse

+0

Decimal(和其他數字類型)沒有分隔符。在轉換爲字符串(使用ToString()方法)後添加。默認的ToString()方法使用您的計算機選定文化的小數點。 –

1

看起來像你的CurrentCulture,作爲NumberDecimalSeparator這就是爲什麼你的解析成功。

實際上,0.2030,203與value相同。只有當你打印它們時,他們的文字表示。

如果您希望將您的價值作爲0,203表示法,您可以使用具有,的文化作爲NumberDecimalSeparator

例如,我的文化(tr-TR)有一個,。當你用它來表示你的小數時,你會得到0,203

string myValue = "0,203"; 
decimal myValueAsDecimal; 
decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal); 
myValueAsDecimal.ToString(new CultureInfo("tr-TR")).Dump(); // 0,203 
1

Decimal的價值是一樣的,不管文化,它的

0。203

什麼樣的變化是它的字符串表示(在你的情況小數點分隔符),所以如果 要更改小數點分隔並且不想改變文化 你可以指定NumberDecimalSeparator您的自定義NumberFormatInfo例如

Decimal d = 0.203M; 

    NumberFormatInfo myNumberInfo = new NumberFormatInfo() { 
    NumberDecimalSeparator = "," // Comma, please 
    }; 

    String result = d.ToString(myNumberInfo); // "0,203" 
相關問題