C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 通貨書式に変換。


(過去ログ 37 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■19322 / inTopicNo.1)  通貨書式に変換。
  
□投稿者/ 猫 (12回)-(2008/05/22(Thu) 10:59:59)

分類:[ASP.NET (C#)] 

2008/05/22(Thu) 11:00:54 編集(投稿者)

現在、
テキストボックスに任意の数値を入力して貰い、ボタンのクリックイベントでテキストボックスの数値を通貨書式に変換するようなコードを打っています。

しかし、TxtBox.Text= string.Format("{0:C}",TxtBox.Text)
と打って実行してみても、テキストボックスの内容に変化がありません。(例:123456789→\123,456,789にしたい)
調べた所、Console.WriteLine(TxtBox.Text.ToString("C"))
という別のコードが出てきましたが、最初にやろうとしていた方はほぼ皆同じ内容(通貨表示の場合は"C"を指定する等)の解説が載っているだけでした。
サンプルも見ましたが、Console.WriteLine(string.Format("{0:C}",TxtBox.Text))
的な記述だったので、特に間違っている場所が見受けられません。

私としては、持っている書籍に色々とサンプルの載っていたTxtBox.Text= string.Format("{0:C}",TxtBox.Text)のやり方でコーディングしたいのですが、変換されないのではどうしようもありません。
何か間違っているのでしょうか?
ご指摘ありましたら、教えて頂きたく思います。

RegularExpressionValidatorを使用して、数値以外の文字列が入力させるとポストバックできないように指定してあります。
テキストボックスからフォーカスを移動させた時に、数値が全角の場合は
TxtBox.Text = Strings.StrConv(TxtBox.Text, VbStrConv.Narrow, 0)で半角に変換しています。
引用返信 編集キー/
■19326 / inTopicNo.2)  Re[1]: 通貨書式に変換。
□投稿者/ ぽぴ王子 (379回)-(2008/05/22(Thu) 11:19:07)
ぽぴ王子 さんの Web サイト
No19322 (猫 さん) に返信

> 現在、
> テキストボックスに任意の数値を入力して貰い、ボタンのクリックイベントでテキストボックスの数値を通貨書式に変換するようなコードを打っています。
>

> しかし、TxtBox.Text= string.Format("{0:C}",TxtBox.Text)
> と打って実行してみても、テキストボックスの内容に変化がありません。(例:123456789→\123,456,789にしたい)
> 調べた所、Console.WriteLine(TxtBox.Text.ToString("C"))
> という別のコードが出てきましたが、最初にやろうとしていた方はほぼ皆同じ内容(通貨表示の場合は"C"を指定する等)の解説が載っているだけでした。
> サンプルも見ましたが、Console.WriteLine(string.Format("{0:C}",TxtBox.Text))
> 的な記述だったので、特に間違っている場所が見受けられません。
>
> 私としては、持っている書籍に色々とサンプルの載っていたTxtBox.Text= string.Format("{0:C}",TxtBox.Text)のやり方でコーディングしたいのですが、変換されないのではどうしようもありません。
> 何か間違っているのでしょうか?
> ご指摘ありましたら、教えて頂きたく思います。

参考になるとしたら、この辺でしょうか。

【標準の数値書式指定文字列】
http://msdn.microsoft.com/ja-jp/library/dwhawy9k%28VS.80%29.aspx

えと、とりあえず TxtBox.Text の型を確かめるといいかな?なんて思ったり。
あとは上のページのタイトルをよーく読んでみるとか。
引用返信 編集キー/
■19328 / inTopicNo.3)  Re[1]: 通貨書式に変換。
□投稿者/ はつね (728回)-(2008/05/22(Thu) 11:41:06)
はつね さんの Web サイト
No19322 (猫 さん) に返信
> TxtBox.Text= string.Format("{0:C}",TxtBox.Text)

"{0:C}"の意味を調べるといいと思います。
0は位置を表し、書式指定子「C」は「数値は、金額を表す文字列に変換されます。」です。
                                  ~~~~

引用返信 編集キー/
■19329 / inTopicNo.4)  Re[1]: 通貨書式に変換。
□投稿者/ 魔界の仮面弁士 (737回)-(2008/05/22(Thu) 12:22:18)
2008/05/22(Thu) 12:26:06 編集(投稿者)

# うっかり VB 構文で書いてしまったので、C# 構文に修正…。
# 参考情報としての FormatCurrency の紹介文も削除。

No19322 (猫 さん) に返信
> しかし、TxtBox.Text= string.Format("{0:C}",TxtBox.Text)

a = String.Format("{0:C}", 123); // 123 は「数値」
b = String.Format("{0:C}", "123"); //"123"は「数字」

上記 a と b が、異なる結果になる事に注意してください。C 書式は文字列型に対しては無効です。


まずは、"123" という数字文字列を、123 という数値に変換する作業が必要ですので、
Decimal.TryParse / Integer.TryParse などの検証機能付き型変換メソッドなどを
用いて、事前に型変換を行ってから、通貨書式に変換するようにしてみてください。
引用返信 編集キー/
■19335 / inTopicNo.5)  Re[2]: 通貨書式に変換。
□投稿者/ 猫 (13回)-(2008/05/22(Thu) 13:06:10)
>ぽぴ王子様
>はつね様
> 魔界の仮面弁士様

ご指摘ありがとうございます。

そうでした…通貨表示は数値で有効でした。
クリックイベント前の段階で、テキストボックスの中身を半角数字に絞り込みをしていたので、「クリックイベント直前ではテキストボックスの中身は数値だ」と勘違いをしてしまったようです。

皆様のご助言を参考に、
クリックイベントにて
TxtBox.Text=string.Format("{0:C}",int.Parse(TxtBox.Text));
を実行しようと思います。

・・・・・・・・うまくいきました!!(嬉)
皆様、本当にありがとうございました。
解決済み
引用返信 編集キー/
■19346 / inTopicNo.6)  Re[3]: 通貨書式に変換。
□投稿者/ Mr.T (247回)-(2008/05/22(Thu) 13:54:13)
Mr.Tです、こんにちは。

> TxtBox.Text=string.Format("{0:C}",int.Parse(TxtBox.Text));
> を実行しようと思います。
>
> ・・・・・・・・うまくいきました!!(嬉)
> 皆様、本当にありがとうございました。

Parseに数値以外の文字が入力された場合、例外が出てしまいますけど、
それはOKですか?

TryParseを利用した方がよさそうな感じがしますけど。

解決済み
引用返信 編集キー/
■19362 / inTopicNo.7)  Re[4]: 通貨書式に変換。
□投稿者/ 猫 (14回)-(2008/05/22(Thu) 15:34:05)
No19346 (Mr.T さん) に返信
> Parseに数値以外の文字が入力された場合、例外が出てしまいますけど、
> それはOKですか?
>
> TryParseを利用した方がよさそうな感じがしますけど。

TryParseの戻り値は確かBool型ですよね?
戻り値がTrueだった場合に変換するというような感じにすればよいのでしょうか?

後、一応、
RegularExpressionValidatorを使用して、数値以外の文字列が入力させるとポストバックできないように指定をしています。
少々小耳にはさんだ事で、「クライアントサイドでの検証だけではエンドユーザーに無効化されてしまう」というものがあったので、
つい先程、TxtBox.Text=string.Format("{0:C}",int.Parse(TxtBox.Text));の記述を、

if (Page.IsValid)

   TxtBox.Text=string.Format("{0:C}",int.Parse(TxtBox.Text))
 }

に加筆したのですが、これでは不十分でしょうか?

初心者故、聞きたいことだらけですみません。
一応、紹介頂いたコードがどういうものなのか検索をかけてから、発言してはいるのですが、自分固有の知識ではない故、少々自信が…。
引用返信 編集キー/
■19366 / inTopicNo.8)  Re[5]: 通貨書式に変換。
□投稿者/ επιστημη (1041回)-(2008/05/22(Thu) 15:54:35)
επιστημη さんの Web サイト
> TryParseの戻り値は確かBool型ですよね?
> 戻り値がTrueだった場合に変換するというような感じにすればよいのでしょうか?

↓こんな感じにすればいぃです。

int amount;
if ( int.TryParse(TxtBox.Text, out amount) ) { // 変換に成功したら
   TxtBox.Text=string.Format("{0:C}",amount); // それを表示
}

引用返信 編集キー/
■19375 / inTopicNo.9)  Re[6]: 通貨書式に変換。
□投稿者/ 猫 (15回)-(2008/05/22(Thu) 16:16:35)
No19366 (επιστημη さん) に返信
> ↓こんな感じにすればいぃです。
>
> int amount;
> if ( int.TryParse(TxtBox.Text, out amount) ) { // 変換に成功したら
> TxtBox.Text=string.Format("{0:C}",amount); // それを表示
> }

サンプルコード、ありがとうございます。
・・・・実は、今試しに打っていたコードは
if (int.TryParse(TxtBox.Text,out))
TxtBox.Text=string.Format("{0:C}"TxtBox.Text);
}
でした。
うまく、行く訳がないです!

正しいコードを見て安堵しました。


・・・・・これを使えばうまくいくとは思うのですが、
自分で
if (Page.IsValid)
の中にコードを記述したのは一番最善策だと思ってやった事なので、
本来のレスとは少し話がそれてしまいますが、
TryParse
がお勧めの理由を教えて頂けないでしょうか?
今後の為にも、是非お願いいたします。
引用返信 編集キー/
■19376 / inTopicNo.10)  Re[7]: 通貨書式に変換。
□投稿者/ επιστημη (1044回)-(2008/05/22(Thu) 16:27:28)
επιστημη さんの Web サイト
> TryParse
> がお勧めの理由を教えて頂けないでしょうか?

「数値以外の文字列が入力させるとポストバックできない」
ってガードが外れちまったときの安全策。

絶対大丈夫! なら int.Parse でもいいのかな。

引用返信 編集キー/
■19378 / inTopicNo.11)  Re[8]: 通貨書式に変換。
□投稿者/ れい (576回)-(2008/05/22(Thu) 16:31:34)
No19376 (επιστημη さん) に返信
> 絶対大丈夫! なら int.Parse でもいいのかな。

私なら
Parseできないときに例外を投げたいという時、
かな。

TryParseは例外を投げずに処理したいとき。
規定値を入れるとか。
引用返信 編集キー/
■19379 / inTopicNo.12)  Re[8]: 通貨書式に変換。
□投稿者/ 猫 (16回)-(2008/05/22(Thu) 16:37:20)
No19376 (επιστημη さん) に返信
> 「数値以外の文字列が入力させるとポストバックできない」
> ってガードが外れちまったときの安全策。

ガードが外れてしまう時があるんですかっ!!!?
if (Page.IsValid)が一番の安全策だと思ってました。
・・・・こちらで質問して良かったと、今心底思っております。

これからは、TryParseを活用させて頂きます。


> 絶対大丈夫! なら int.Parse でもいいのかな。

何をもってして、「絶対大丈夫!」とすればいいのか分からなくなってきました。
(そもそも、この世に「絶対」はないですし)
大事をとって、より安全度が高いと思わしきTryParseを使用させて頂きます。


ご享受頂き、本当にありがとうございました。
今後の糧とさせて頂きます。
解決済み
引用返信 編集キー/
■19380 / inTopicNo.13)  Re[9]: 通貨書式に変換。
□投稿者/ επιστημη (1045回)-(2008/05/22(Thu) 16:43:10)
επιστημη さんの Web サイト
> 大事をとって、より安全度が高いと思わしきTryParseを使用させて頂きます。

int.Parse でもいいんですよ。
ただし、変換不能な文字列食わすと例外(ArgumentNullException
 / FormatException / OverflowException のどれか)が投げられます。
 
その例外にきちんと対処すれば問題ありません。

解決済み
引用返信 編集キー/
■19381 / inTopicNo.14)  Re[9]: 通貨書式に変換。
□投稿者/ いしだ (120回)-(2008/05/22(Thu) 16:51:28)
こんにちは。

> if (Page.IsValid)が一番の安全策だと思ってました。
RegularExpressionValidator

Page.IsValid
の組み合わせで十分だと思いますよ。
TryParseはする必要無いと思います。
ただし、RegularExpressionValidatorできちんとフォーマットチェックが
出来ていればですが。
解決済み
引用返信 編集キー/
■19386 / inTopicNo.15)  Re[9]: 通貨書式に変換。
□投稿者/ 猫 (17回)-(2008/05/22(Thu) 17:20:14)
■19380 (επιστημη さん)に返信
>int.Parse でもいいんですよ。
>ただし、変換不能な文字列食わすと例外(ArgumentNullException/ FormatException / OverflowException のどれか)が投げられます。
>
>その例外にきちんと対処すれば問題ありません。

RegularExpressionValidator
Page.IsValid
int.Parse
int.TryParse
現在、それぞれ、組み合わせを変えてデバックして仕様を試してみました。
・・・・思いっきりFormatExceptionを投げ付けられました。

例外に対処・・・う〜ん・・・
try
{
}
catch
{
}
finally
{
}
を活用すればいいのか?
でも、そうするとεπιστημηさんのサンプルコードと同じ様な効力を発揮するので、より(後々見た自分が)ぱっと見てわかりやすくするなら、IF…ELSE使ったTryParseを活用する方が(自分にとって)いい気がしてきました。

No19378 (れい さん) に返信
> 私なら
> Parseできないときに例外を投げたいという時、
> かな。
>
> TryParseは例外を投げずに処理したいとき。
> 規定値を入れるとか。

なるほど、そういう状況を求められる時がいずれ来る可能性は否めませんね!
こういうときはこれ(今で言う、TryParse)、あぁいうときはそれ(今で言う、int.Parse)と決めつけないで、臨機応変に使い分けができるように心がけてみます。



■19381 (いしだ さん)に返信
>ただし、RegularExpressionValidatorできちんとフォーマットチェックが出来ていればですが。

・・・もはや、どんな例外が起きるのかPG歴一年未満の浅はかな頭では予測不能です。
コードのシンプルさという利点もありますので、一応int.TryParseを使おうと考えております。

とは言いましても、これからのコーディング状況によって右往左往するとは思いますが・・・(汗)




皆様、色々なご意見ありがとうございました。
一点集中で、「int.Parseしか使えない。」位の気持ちでいたので、とても視野が広がって気がします。
解決済み
引用返信 編集キー/
■19442 / inTopicNo.16)  Re[10]: 通貨書式に変換。
□投稿者/ Mr.T (248回)-(2008/05/23(Fri) 08:20:05)
Mr.Tです、こんにちは。

補足みたいなもんですが、directcastを使うときと、TryCastを使うときって
どういうときなの?ってのを渋木さんに教えてもらったエントリがあります。
参考までに。
http://blogs.wankuma.com/mrt/archive/2007/10/11/101307.aspx


解決済み
引用返信 編集キー/
■19447 / inTopicNo.17)  Re[11]: 通貨書式に変換。
□投稿者/ 猫 (18回)-(2008/05/23(Fri) 09:48:25)
2008/05/23(Fri) 09:48:39 編集(投稿者)

No19442 (Mr.T さん) に返信
> Mr.Tです、こんにちは。
>
> 補足みたいなもんですが、directcastを使うときと、TryCastを使うときって
> どういうときなの?ってのを渋木さんに教えてもらったエントリがあります。
> 参考までに。
> http://blogs.wankuma.com/mrt/archive/2007/10/11/101307.aspx

Directcastですか・・・(こんなのもあったのか・・・と今知りました)。
パフォーマンスは高いようですが、強制的な型の変換というあたりで少し使うのを敬遠してしまいます。

今はまだ、どんな時にどの構文が有効か、という知識と経験が非常に乏しいので、「とりあえず、やりたいことが実行できる為のコーディング」をしている状態ですが、もっと知識を広げて適材適所の使い分けができるように心がけていきます。

補足ありがとうございます。
同じような効力を発揮する構文と絡めて使用のメリット・デメリットを比較すると、とても分かり易く頭に入り易いので、とても助かります。
基本的な事なのかもしれませんが、現在はその基本的な部分も手探りで学習している状況ですので、こういった補足や助言はとてもありがたいです。

Mr.Tさん、
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -