2017-01-26 9 views
0

私は通貨記号で文字列を解析する方法を説明しているこのような多くの質問があることを知っています。ここでも同じことをしたいと思いますが、通貨ISO-4217コード(https://en.wikipedia.org/wiki/ISO_4217)を使用しています。通貨コードを含む文字列の解析?

decimal.Parse("45,000.00 USD", System.Globalization.NumberStyles.AllowDecimalPoint) 
decimal.Parse("45.00 USD") 
decimal.Parse("USD 45.00") 
decimal.Parse("USD45.00") 
decimal.Parse("45.00USD") 
decimal.Parse("45.00 RUP") 
decimal.Parse("IND 45.00") 
decimal.Parse("45.00 EUR") 
decimal.Parse("INR 45.00") 

私は正規表現を用いて溶液を考えていたが、おそらく、より直接的な解決策か何かは、すでに.NETのlibに存在しています。知りません。

+0

これは1つのコードとすべてのコードに対応していますか? – Nkosi

答えて

1

を使用することができます。

下記の例を参照してください。このとき

var nmfi = new NumberFormatInfo(); 
nmfi.NegativeSign = "-"; 
nmfi.CurrencySymbol = "USD"; 
nmfi.CurrencyDecimalSeparator = "."; 
nmfi.CurrencyGroupSeparator = ","; 

var result1 = decimal.Parse("USD45.00", NumberStyles.Currency, nmfi); 
var result2 = decimal.Parse("45.00USD", NumberStyles.Currency, nmfi); 
var result3 = decimal.Parse("45.00 USD", NumberStyles.Currency, nmfi); 
+0

この例は、特定のシンボルに対してのみ機能します。ここUSD。 1. "USD"は記号ではありません。 CurrencySymbolとして使用することは、ソリューションよりも回避策です。これは多くの異なる通貨コードで動作します。私は現在の通貨が存在するかどうかをチェックしていません。 –

+1

@ngeksyoあなたが応答している人は* OPなので、彼らは質問を誤解していると言って少し奇妙です。つまり、元の質問*はUSDの例しか求めていませんでした。 – Rob

-1

あなたはあなたがするNumberFormatInfoを使用することができます正規表現

Decimal.Parse(Regex.Match("USD 45.00", @"(\d+(\.\d+)?)").Value); 
+0

これは正しくありません。正規表現に小数は含まれません。 –

+0

@ B413更新コード –

0

私はお金のオブジェクトを使用して、私のコードでは、鉱山

public static decimal Parse(string s) 
{ 
    if (string.IsNullOrEmpty(s)) 
     throw new ArgumentNullException("s is null"); 
    var match = Regex.Match(s, "[A-Z]{3}"); 
    if (!match.Success) 
     throw new FormatException("s is not in the correct format. Currency code is not found."); 
    s = s.Replace(match.Value, string.Empty); // I don't like this line 
    decimal value = decimal.Parse(s, NumberStyles.Currency); 
    return value; 
} 

よりもよりよい解決策を持っていません。 Moneyは10進値と3文字の通貨コードで構成されます。

public static Money Parse(string s) 
{ 
    if (string.IsNullOrEmpty(s)) 
     throw new ArgumentNullException("s is null"); 
    var match = Regex.Match(s, "[A-Z]{3}"); 
    if (!match.Success) 
     throw new FormatException("s is not in the correct format. Currency code is not found."); 
    s = s.Replace(match.Value, string.Empty); // I don't like this line 
    decimal value = decimal.Parse(s, NumberStyles.Currency); 
    return new Money(value, (CurrencyCode)Enum.Parse(typeof(CurrencyCode), match.Value)); 
} 
+0

通貨記号を取り除き、必要な数字だけを抽出したい場合は、このソリューションは優れています。 – ngeksyo

+0

@ B412、私はちょうどhttps://github.com/richardschneider/moneyworks(JavaScript)をC#に変換し始めました。もしあなたが協力したいのであれば、makaretuにメールを送るにはgmail dot com –

+0

私は最高のロボットがあなたのメールをこのように読むことができると思います。 –

0

ここで最も適切なのは、値の通貨がわかりやすいように10進数をその形式で束ねることです。私はこのようなことを助けるためにIsoDecimalヘルパーstructを作成しました。

void Main() 
{ 
    var arr = new string[] 
    { 
     "45,000.00 USD" , 
     "45.00 USD"  , 
     "USD 45.00"  , 
     "USD45.00"  , 
     "45.00USD"  , 
     "45.00 RUP"  , 
     "IND 45.00"  , 
     "45.00 EUR"  , 
     "INR 45.00"  
    }; 

    foreach (var num in arr) 
    { 
     Console.WriteLine(new IsoDecimal(num).ToString()); 
    } 
} 

structはこちらです。

public struct IsoDecimal 
{ 
    private NumberFormatInfo numberFormat { get; set; } 
    private decimal value { get; set; } 

    public IsoDecimal(string strValue) 
    { 
     string strNumber = Regex.Match(strValue, @"[\d.\-,]+").Value; 
     string code = Regex.Match(strValue, @"[A-Z]+").Value; 

     numberFormat = new NumberFormatInfo(); 
     numberFormat.NegativeSign = "-"; 
     numberFormat.CurrencyDecimalSeparator = "."; 
     numberFormat.CurrencyGroupSeparator = ","; 
     numberFormat.CurrencySymbol = code; 

     value = Decimal.Parse(strNumber); 
    } 

    public static implicit operator decimal(IsoDecimal isoDecimal) 
    { 
     return isoDecimal.value; 
    } 

    public override string ToString() 
    { 
     return ToString("C"); 
    } 

    public string ToString(string format) 
    { 
     return value.ToString(format, numberFormat); 
    } 
} 

structは、あなたがそれを必要とする場合には意志でdecimal変数に値を割り当てることができ、そして統合して動作するようにシームレスであることにObject.ToStringを上書きします。

関連する問題