2010-05-04 121 views
2

我的web應用程序處理需要轉換爲數字的字符串 - 用戶經常在這些字段中輸入逗號,單位(如cm,m,g,kg)和貨幣符號,我想要做的是創建一個字符串擴展方法,清理字段並將其轉換爲小數。用於字符串數據類型的C#擴展方法

例如:

decimal myNumber = "15 cm".ToDecimal(); 
+3

在閱讀「......人被帶走」後,我希望我沒有發佈。也許如果你問正確的問題而不是將貨幣帶入方程式,你可能會得到你正在尋找的答案,而不是從這個聽起來真的不值一提。在我看來,你被你的問題「帶走」了。如果你真的打算使用字符串操作進行貨幣解析,祝你好運。 – spender 2010-05-04 09:16:12

+0

我很抱歉冒犯了你,我很欣賞每個人的意見,但是,由於這篇文章有權,我正在尋找的是一種創建字符串擴展方法的方法,無論出於何種原因。 – Jimbo 2010-05-05 07:17:52

回答

6

你期待不同「文化」的用戶使用您的應用程序?如果是這樣,最好在用戶的區域設置係數:

static decimal ToDecimal(this string str) 
{ 
    return Decimal.Parse(str, CultureInfo.CurrentCulture); 
} 

或者你可以在STR替代的每一個字符不是一個數字或CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator值,然後解析它作爲一個小數。

編輯:
一般認爲,擴展方法應該有自己的命名空間。這將避免命名衝突並迫使最終用戶有選擇地導入他們所需的擴展。

+0

謝謝。需要注意的是,對於上述實現,包含STATIC CLASS的擴展方法必須與擴展類位於相同的NAMESPACE中,否則您將不得不包含擴展方法所在的名稱空間。 – Jimbo 2010-05-05 07:39:45

+0

@Jimbo:其實建議你爲你的擴展方法創建一個單獨的命名空間,並強制用戶導入它們。原因之一是擴展方法可能特定於特定的業務領域;不是每個開發人員都希望看到每種擴展方法,特別是如果你有很多擴展方法的話。在這種情況下,人爲的示例名稱空間可以是'namespace Extensions.Currency'。 – 2010-05-05 08:37:14

1

請閱讀本文關於貨幣實現http://msdn.microsoft.com/en-us/goglobal/bb688126.aspx

實施例:

Double myNumber = Double.Parse("$1,250.85", NumberStyles.Any); 

PS。您試圖將浮點值解析爲十進制類型。

+0

我認爲Jimbo需要閱讀一種貨幣,而不是寫它。 – Oliver 2010-05-04 09:05:51

+0

這是讀取貨幣,非常好,謝謝 - 但是,我想知道如何使字符串擴展方法無論如何:P – Jimbo 2010-05-04 09:13:38

+0

@Jimbo:myNumber.ToString(「C」); – Svisstack 2010-05-04 17:56:58

0

解決此問題的最合適的方法似乎是使用接受NumberStyles和文化的Decimal.TryParse的超負荷。通過它NumberStyles.Currency和適當的文化。現在

,沒有什麼能阻止你提供的擴展方法上string調用此 - 但你需要考慮你想要什麼樣的d值是後

decimal d = "ponies".ToDecimal(); 
+0

是否有可能重載'Decimal.TryParse'?謝謝 – Jimbo 2010-05-04 09:19:03

1
public static double ToDecimal(this string value) 
     { 
      ... your parsing magic 
     } 
0

最大的問題是您必須知道用戶輸入號碼的文化。否則,你會遇到大問題。

一個小例子是把你的電話號碼改爲英文或德文。

英文NumberFormatInfo.CurrencyDecimalSeparator是一個點(。)和NumberFormatInfo.CurrencyGroupSeparator是一個逗號(,)。在德國,恰恰相反。因此,如果用戶意味着一千二百五十或一美元和四美元,你可以開始瘋狂猜測。

也許你可以跑過所有可用的文化,並檢查你的用戶輸入是否包含NumberFormatInfo.CurrencySymbol,然後嘗試給定的文化。但也許有文化使用相同的符號但不同的分隔符。

所以要真正實現這個目標,你只需要兩個真正的選擇: *告訴你的用戶在哪種文化格式下輸入他們的值。 *給予用戶告訴你他們決定採用哪種文化的可能性。

所有可用文化的列表可以通過CultureInfo.GetCultures()

0

只是回答讓我如何創建擴展方法的字符串類:

public static class MyStringExtensions { 
public static ToDecimal(this string input) { 
    // ... 
} 
} 

(你需要有一個using語句的命名空間它位於爲了使用它)

5

擴展方法是以下形式的:

public static class StringExtensions 
{ 
    public static decimal ToDecimal(this string input) 
    { 
     //your conversion code here 
    } 
} 
  • 包含的類必須是靜態的。 該方法也是靜態的注意 「this」關鍵字。我建議 約定的分組分機 的方法由它們的 所引用的類型,但沒有要求 這樣做。

這是用於書寫擴展方法的guide