none
文字列の扱い(金額表示→数値)について、教えて下さい。 RRS feed

  • 質問

  • みなさん、こんにちは!
    いつもお世話になります。

    早速ですが、文字列の扱いについて、教えて下さい。
    質問の内容を下記の例で示します。

        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の書かれた金額表示を簡単に値に変換したいのです。

    このケースの動きは掌握できたので、細かく処理すれば目的は果たせるのですが、どうも
    シックリしないと言うか、気になります。

    さっぱりと記述する方法をご教授頂ければありがたいです。
    宜しくお願い致します。

    2010年10月22日 7:42

回答

  • ちなみに・・・

    > 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", ""));

    2010年10月22日 8:53
  • > 書式指定によりtextBoxの書かれた金額表示を簡単に値に変換したいのです

    decimal.ToString() で変換したなら、decimal.Parse() で逆変換すればいいのではないですか?

    通貨スタイルで文字列にした場合は、Parse に NumberStyle.Currency を指定すればよいだけですよね?

    2010年10月22日 8:07
  • 以下のように、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:35
    モデレータ

すべての返信

  • > 書式指定によりtextBoxの書かれた金額表示を簡単に値に変換したいのです

    decimal.ToString() で変換したなら、decimal.Parse() で逆変換すればいいのではないですか?

    通貨スタイルで文字列にした場合は、Parse に NumberStyle.Currency を指定すればよいだけですよね?

    2010年10月22日 8:07
  • 以下のように、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:35
    モデレータ
  • K. Takaoka さん、有り難うございました。

    これまで、 decimal x = decimal.Parse(buff); としていて、例外が発生するため、金額表示の
    文字列をそのまま変換できないものと思って、自分で細かな前処理をしていました。

    教えて頂いたように

    decimal x = decimal.Parse(buff, System.Globalization.NumberStyles.Currency);

    とすれば、旨く変換されました。
    インテリセンスのパラメータヒントをよく見れば記載されているようですね。

    どうも有り難うございました。
    これでクローズさせて頂きます。

    2010年10月22日 8:44
  • ひらぽん さん、何時も有り難うございます。

    先に教えて頂いた方法を確認している間に、詳しいご説明を頂き、有り難うございます。

    パラメーターの設定の仕方など、更に勉強してみたいと思っています。

    有りがとうございました。

    これからも、どうぞ宜しくお願い致します。

     

    2010年10月22日 8:52
  • ちなみに・・・

    > 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", ""));

    2010年10月22日 8:53
  • TH01 さん、有り難うございます。

    書式を指定して書いた場合にのみ、旨くいかないので、多分同じように「¥」と見えても文字コードが

    違っているのだろうと言う所までは考えたのですが、そのコードを旨く調べる事ができませんでした。

    その違いについても、ここで教えて頂き知識を増やす事がで感謝しています。

    どうも、有り難うございました。 これからも宜しくお願いします。

    2010年10月22日 9:01