トップ回答者
文字列の扱い(金額表示→数値)について、教えて下さい。

質問
-
みなさん、こんにちは!
いつもお世話になります。早速ですが、文字列の扱いについて、教えて下さい。
質問の内容を下記の例で示します。string buff;
decimal value = -12345;textBox1.Text = value.ToString("C");
buff = textBox1.Text; -----> buffに直接文字列を代入した場合、この問題は発生しません。MessageBox.Show(buff);-----> -¥12,345 と表示されます。
MessageBox.Show(buff.Remove(0, 1));
MessageBox.Show(buff.Replace("-", ""));-->共に、¥12,345 と表示されます。MessageBox.Show(buff.Remove(1, 1));---> -12.345 と表示されます。
MessageBox.Show(buff.Replace("\\", ""));--> Replace が行われず -¥12,345 になります。表示の都合上「¥」と表示していますが、実際には半角の「¥」が表示されます。
多分、書式指定を行って textBox1.Text に表示された文字列の仕組みには、何らかの
違いがあるのだと想像できますが、それ以上の事は分かりません。やりたい事は、書式指定によりtextBoxの書かれた金額表示を簡単に値に変換したいのです。
このケースの動きは掌握できたので、細かく処理すれば目的は果たせるのですが、どうも
シックリしないと言うか、気になります。さっぱりと記述する方法をご教授頂ければありがたいです。
宜しくお願い致します。
回答
-
ちなみに・・・
> MessageBox.Show(buff.Replace("\\", ""));--> Replace が行われず -¥12,345 になります。
Replace が行われないのは、同じ¥に見えても、実際はキャラクターコードが違うためです。
Replace に指定されている普通の「¥」は以下の c1 の文字ですが、-¥12,345 の「¥」は下の c2 の文字です。
コントロールパネルの「通貨記号」の設定値が既定で c2 の値になっています。
(追記:NumberFormatInfo.CurrentInfo.CurrencySymbol で取得できます。)
char c1 = '\u005c'; // (char)92
char c2 = '\u00a5'; // (char)165
もしも Replace したい状況があれば、次のようにすると両方に対処できます。
MessageBox.Show(buff.Replace(@"\", "").Replace("\u00a5", "")); -
以下のように、Parse メソッドでスタイルとカルチャを指定して変換する方法もあります。この例では、16進以外のすべての書式と現在のカルチャを指定して変換しています。
using System; using System.Globalization; class Program { static void Main(string[] args) { string buff; decimal value = -12345; buff = value.ToString("C"); Console.WriteLine(buff); // -¥12,345 と表示されます。 decimal value2 = decimal.Parse(buff, NumberStyles.Any, NumberFormatInfo.CurrentInfo); Console.WriteLine(value2.ToString()); Console.ReadKey(); } }
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク おおつの井上です。 2010年10月22日 8:55
すべての返信
-
以下のように、Parse メソッドでスタイルとカルチャを指定して変換する方法もあります。この例では、16進以外のすべての書式と現在のカルチャを指定して変換しています。
using System; using System.Globalization; class Program { static void Main(string[] args) { string buff; decimal value = -12345; buff = value.ToString("C"); Console.WriteLine(buff); // -¥12,345 と表示されます。 decimal value2 = decimal.Parse(buff, NumberStyles.Any, NumberFormatInfo.CurrentInfo); Console.WriteLine(value2.ToString()); Console.ReadKey(); } }
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク おおつの井上です。 2010年10月22日 8:55
-
K. Takaoka さん、有り難うございました。
これまで、 decimal x = decimal.Parse(buff); としていて、例外が発生するため、金額表示の
文字列をそのまま変換できないものと思って、自分で細かな前処理をしていました。教えて頂いたように
decimal x = decimal.Parse(buff, System.Globalization.NumberStyles.Currency);
とすれば、旨く変換されました。
インテリセンスのパラメータヒントをよく見れば記載されているようですね。どうも有り難うございました。
これでクローズさせて頂きます。 -
ちなみに・・・
> MessageBox.Show(buff.Replace("\\", ""));--> Replace が行われず -¥12,345 になります。
Replace が行われないのは、同じ¥に見えても、実際はキャラクターコードが違うためです。
Replace に指定されている普通の「¥」は以下の c1 の文字ですが、-¥12,345 の「¥」は下の c2 の文字です。
コントロールパネルの「通貨記号」の設定値が既定で c2 の値になっています。
(追記:NumberFormatInfo.CurrentInfo.CurrencySymbol で取得できます。)
char c1 = '\u005c'; // (char)92
char c2 = '\u00a5'; // (char)165
もしも Replace したい状況があれば、次のようにすると両方に対処できます。
MessageBox.Show(buff.Replace(@"\", "").Replace("\u00a5", ""));