DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataFormatString="{0:c}"からのキャストについて

環境/言語:[ASP.NET 2.0  VisualStudio2005(VB)  SqlServer2008]
分類:[ASP.NET]


いつも参考にさせていただいております。
キャストについてご教示願います。

asp:GridView 項目を
asp:BoundField でDataFormatString="{0:c}"を指定しいる場合、
画面表示では「¥」円マーク付きで表示されます。

VB.NET側処理で該当項目を算出したい場合のキャスト処理が
うまく実行できずに困っております。

Convert.ToInt32(gvCancelResultD.Rows.Item(i).Cells(8).Text)
エラー:入力文字列の形式が正しくありません。 と表示されます。
gvCancelResultD.Rows.Item(i).Cells(8).Text.ToStringのように
単純に当然、中身は「¥」マーク付きです。

どのようにキャストするとうまくINT型で算出する事が可能でしょうか。

宜しくお願い致します。
2011/03/16(Wed) 00:57:43 編集(投稿者)

問題はシンプルに書きましょう。
要するに、C# のコードで「\100」という文字列を 100 と数値として解釈したいということですよね。
int.Parse メソッドで NumberStyles.Currency を指定すれば良いでしょう。

// 例
int value = int.Parse(@"\100", NumberStyles.Currency);
value = int.Parse(@"\100,000", NumberStyles.Currency);

必要に応じて名前空間を using してください。

http://msdn.microsoft.com/ja-jp/library/c09yxbyt.aspx
http://msdn.microsoft.com/ja-jp/library/system.globalization.numberstyles.aspx
■No28321に返信(Azuleanさんの記事)
> 要するに、C# のコードで「\100」という文字列を 100 と数値として解釈したいということですよね。

恐らくは、C# ではなく VB だと思います。C# だとしたら
>> Convert.ToInt32(gvCancelResultD.Rows.Item(i).Cells(8).Text)
ではなく、
   Convert.ToInt32(gvCancelResultD.Rows[i].Cells[8].Text)
といった表記にしているでしょうから。
2011/03/16(Wed) 11:33:57 編集(投稿者)
2011/03/16(Wed) 11:33:25 編集(投稿者)
2011/03/16(Wed) 11:33:20 編集(投稿者)

> 恐らくは、C# ではなく VB だと思います。C# だとしたら
> >> Convert.ToInt32(gvCancelResultD.Rows.Item(i).Cells(8).Text)
> ではなく、
> Convert.ToInt32(gvCancelResultD.Rows[i].Cells[8].Text)
> といった表記にしているでしょうから。

Azuleanさん、魔界の仮面弁士さん、皆様

シンプルに記述したつもりが回りくどい、誤解を招きやすい結果となって申し訳御座いません。VBキャスト・算出方法をご教示アドバイス願います。

ASPX内で記述抜粋
<asp:GridView〜
<Columns>〜

<asp:BoundField DataField="税抜小計" HeaderText="税抜小計" ReadOnly="True" SortExpression="税抜小計" DataFormatString="{0:c}">
<ItemStyle HorizontalAlign="Right"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="税込小計" HeaderText="税込小計" ReadOnly="True" SortExpression="税込小計" DataFormatString="{0:c}">
<ItemStyle HorizontalAlign="Right"></ItemStyle>
</asp:BoundField>

</Columns>
</asp:GridView>

上記の記述内容をVB側のボタンアクションで処理をしたいです。

VB側の処理〜抜粋
''ボタン処理
Protected Sub btnCalculation_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCalculation.Click


''グリッドビューから対象項目取得
Dim strTest As String = gvCancelResultD.Rows.Item(i).Cells(8).Text.ToString
''変換処理
Convert(strTest, Globalization.NumberStyles.AllowCurrencySymbol Or _
Globalization.NumberStyles.Number)

End Sub

Private Sub Convert(ByVal value As String, ByVal style As Globalization.NumberStyles)
Try
Dim number As Integer = Int32.Parse(value, style)
Console.WriteLine("Converted '{0}' to {1}.", value, number)
''◆↓↓のExceptionに入る
Catch e As FormatException
Console.WriteLine("Unable to convert '{0}'.", value)
Catch e As OverflowException
Console.WriteLine("'{0}' is out of range of the Int32 type.", value)
End Try

End Sub

ご教示アドバイス宜しくお願いいたします。

エラー情報
デバッグした場合に
エラー内容-:{"入力文字列の形式が正しくありません。"} System.FormatException

System.FormatException' の初回例外が mscorlib.dll で発生しました。

Dim strTest As String = gvCancelResultD.Rows.Item(i).Cells(8).Text.ToString
取得結果:&#165;19,480
画面表示:\19,480
■No28323に返信(はちまきさんの記事)

> 取得結果:&#165;19,480
ここから取得しなければいけないので
Replaceで&#165;を空文字列に置換してからParseするとよいのではないでしょうか?
■No28322に返信(魔界の仮面弁士さんの記事)
> 恐らくは、C# ではなく VB だと思います。C# だとしたら

ご指摘ありがとうございます。
そこに気づけてませんでした。。。


■No28323に返信(はちまきさんの記事)
> 取得結果:&#165;19,480
> 画面表示:\19,480

文字列として得られたものが &#165; とエスケープされているのであれば、HttpUtility.HtmlDecode を通す必要があるのかもしれませんね。
ただ、必ず通して良いものかどうか、Web 系に疎い私には判断がつきません。
セキュリティリスクがないかも含めて、動作検証を十分に行ってください。

> ■No28323に返信(はちまきさんの記事)
>>取得結果:&#165;19,480
>>画面表示:\19,480
>
> 文字列として得られたものが &#165; とエスケープされているのであれば、HttpUtility.HtmlDecode を通す必要があるのかもしれませんね。
> ただ、必ず通して良いものかどうか、Web 系に疎い私には判断がつきません。
> セキュリティリスクがないかも含めて、動作検証を十分に行ってください。

皆様、ご教示&アドバイス有難う御座います。
Substring関数を使用し、\や&#165;を取り除き対応しました。

HttpUtility.HtmlDecodeの使用についても試してみます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板