我的web應用程序處理需要轉換爲數字的字符串 - 用戶經常在這些字段中輸入逗號,單位(如cm,m,g,kg)和貨幣符號,我想要做的是創建一個字符串擴展方法,清理字段並將其轉換爲小數。用於字符串數據類型的C#擴展方法
例如:
decimal myNumber = "15 cm".ToDecimal();
我的web應用程序處理需要轉換爲數字的字符串 - 用戶經常在這些字段中輸入逗號,單位(如cm,m,g,kg)和貨幣符號,我想要做的是創建一個字符串擴展方法,清理字段並將其轉換爲小數。用於字符串數據類型的C#擴展方法
例如:
decimal myNumber = "15 cm".ToDecimal();
你期待不同「文化」的用戶使用您的應用程序?如果是這樣,最好在用戶的區域設置係數:
static decimal ToDecimal(this string str)
{
return Decimal.Parse(str, CultureInfo.CurrentCulture);
}
或者你可以在STR替代的每一個字符不是一個數字或CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator
值,然後解析它作爲一個小數。
編輯:
一般認爲,擴展方法應該有自己的命名空間。這將避免命名衝突並迫使最終用戶有選擇地導入他們所需的擴展。
謝謝。需要注意的是,對於上述實現,包含STATIC CLASS的擴展方法必須與擴展類位於相同的NAMESPACE中,否則您將不得不包含擴展方法所在的名稱空間。 – Jimbo 2010-05-05 07:39:45
@Jimbo:其實建議你爲你的擴展方法創建一個單獨的命名空間,並強制用戶導入它們。原因之一是擴展方法可能特定於特定的業務領域;不是每個開發人員都希望看到每種擴展方法,特別是如果你有很多擴展方法的話。在這種情況下,人爲的示例名稱空間可以是'namespace Extensions.Currency'。 – 2010-05-05 08:37:14
請閱讀本文關於貨幣實現http://msdn.microsoft.com/en-us/goglobal/bb688126.aspx
實施例:
Double myNumber = Double.Parse("$1,250.85", NumberStyles.Any);
PS。您試圖將浮點值解析爲十進制類型。
解決此問題的最合適的方法似乎是使用接受NumberStyles
和文化的Decimal.TryParse
的超負荷。通過它NumberStyles.Currency
和適當的文化。現在
,沒有什麼能阻止你提供的擴展方法上string
調用此 - 但你需要考慮你想要什麼樣的d
值是後
decimal d = "ponies".ToDecimal();
是否有可能重載'Decimal.TryParse'?謝謝 – Jimbo 2010-05-04 09:19:03
public static double ToDecimal(this string value)
{
... your parsing magic
}
最大的問題是您必須知道用戶輸入號碼的文化。否則,你會遇到大問題。
一個小例子是把你的電話號碼改爲英文或德文。
英文NumberFormatInfo.CurrencyDecimalSeparator是一個點(。)和NumberFormatInfo.CurrencyGroupSeparator是一個逗號(,)。在德國,恰恰相反。因此,如果用戶意味着一千二百五十或一美元和四美元,你可以開始瘋狂猜測。
也許你可以跑過所有可用的文化,並檢查你的用戶輸入是否包含NumberFormatInfo.CurrencySymbol,然後嘗試給定的文化。但也許有文化使用相同的符號但不同的分隔符。
所以要真正實現這個目標,你只需要兩個真正的選擇: *告訴你的用戶在哪種文化格式下輸入他們的值。 *給予用戶告訴你他們決定採用哪種文化的可能性。
所有可用文化的列表可以通過CultureInfo.GetCultures()
只是回答讓我如何創建擴展方法的字符串類:
public static class MyStringExtensions {
public static ToDecimal(this string input) {
// ...
}
}
(你需要有一個using語句的命名空間它位於爲了使用它)
擴展方法是以下形式的:
public static class StringExtensions
{
public static decimal ToDecimal(this string input)
{
//your conversion code here
}
}
這是用於書寫擴展方法的guide。
在閱讀「......人被帶走」後,我希望我沒有發佈。也許如果你問正確的問題而不是將貨幣帶入方程式,你可能會得到你正在尋找的答案,而不是從這個聽起來真的不值一提。在我看來,你被你的問題「帶走」了。如果你真的打算使用字符串操作進行貨幣解析,祝你好運。 – spender 2010-05-04 09:16:12
我很抱歉冒犯了你,我很欣賞每個人的意見,但是,由於這篇文章有權,我正在尋找的是一種創建字符串擴展方法的方法,無論出於何種原因。 – Jimbo 2010-05-05 07:17:52