お世話になります。
現在、フォーム上に数値を表示させるラベルと、
金額を入力するテキストボックスを配置して、
金額を入力すると、それに伴い、ラベルに金額が反映されるようにしてあります。
それぞれで、カンマ区切りの表示にさせたいのですが、
数値を表示させるには、Load時にToString()で対応できたのですが、
入力する金額をカンマ区切りにさせる方法が上手く行かないのですが、
金額を入力した後など、動作毎にToString()を走らせるしかないのでしょうか?
>入力する金額をカンマ区切りにさせる方法が上手く行かない
具体的にどういう動作をさせたいのかな?
どういうコードを書いたのかな?
うまくいかないってのはエラーになるのかな?
想定と違う動きをするってことかな?
説明不足ですみません。
テキストボックスのLeaveイベントに、
Dim temp as integer
temp = textbox.text
textbox.text = textbox.ToString("#,##0")
というコードを書きました。
実行すると、入力は受け付けますが、別の部分をクリックすると、
元の数値に戻ります(以前数値を入力した場合は、前回の値が反映されています)。
エラーは出ないのですが、変更が反映されないということです。
ToStringでは無くてFormatかな
textbox.Text = String.Format("{0:#,##0} 円", Convert.ToInt32(textbox.Text))
# 例外処理は別途必要。
# 手打ちコードの貼り付けは出来るだけ止めよう。
ありゃ!
100,000は『桁区切り』とは言うが、『カンマ区切り』とは言わないか。
誤爆の予感(^^;
> ToStringでは無くてFormatかな
一応、ToString でもできます。
ただ、ToString でやるにしても String.Format メソッドでやるにしても、
文字列の型では数値の書式指定ができないのですね。
If 自作IsNumeric(Me.TextBox1.Text) Then
Dim iText As Integer = Int32.Parse(Me.TextBox1.Text)
Me.TextBox1.Text = iText.ToString("#,##0")
End If
> 誤爆の予感(^^;
えっと、金額のカンマ区切りと書いてあるので、
数値などに使う 3 桁区切りだと脳内置換して正解だと思います...
ねろさま、早速試して見ました。
数値として扱いたかったので、下記の通り変更をしましたところ
表示も入力も出来ました。
txtmo1.Text = String.Format("{0:#,##0}", Convert.ToDecimal(txtmo1.Text))
ただ、こうすると、千の位までは、普通に入力できますが、
1,000まで行くと、カーソルが一番先頭に移動してしまいます。
例> 4,500| => |4,500
45,000と打ちたい場合は、一旦カーソルを移動させないといけませんが、
(これ以上打とうとすると、一回数字を押すたびに、カーソルが先頭へ移動します)
これは、コード以外の原因でしょうか?
すみません。画面の更新してませんでした。。。
>えっと、金額のカンマ区切りと書いてあるので、
>数値などに使う 3 桁区切りだと脳内置換して正解だと思います...
じゃんぬねっとさんの通りであります。
>じゃんぬねっとさん
>一応、ToString でもできます。
なる程そうでした、どのみち一度文字を数値に変換する訳ですからね。
有難うございます。
>1,000まで行くと、カーソルが一番先頭に移動してしまいます
textbox_TextChanged にコードを書いてますね。
Dim s As String = textbox.Text
s = s.Replace(",", "")
Try
s = String.Format("{0:#,##0}", Convert.ToInt32(s))
Catch
'オーバーフロー処理
'数字以外の入力の処理
End Try
textbox.Text = s
textbox.SelectionStart = textbox.Text.Length
こんなかな、だんだん自信がなくなってきた。。。
こっちの方が良いかな。
Dim s As String = textbox.Text
Static bs As String = ""
s = s.Replace(",", "")
Try
s = String.Format("{0:#,##0}", Convert.ToInt32(s))
bs = s
textbox.Text = s
textbox.SelectionStart = textbox.Text.Length
Catch
If s.Length <> 0 Then
textbox.Text = bs
Else
textbox.Text = ""
End If
End Try
ねろさんのコードを元にしたところ、
Dim s As String = textbox.Text
s = s.Replace(",", "")
Try
s = String.Format("{0:#,##0}", Convert.ToDecimal(s))
Catch
'オーバーフロー処理
'数字以外の入力の処理
End Try
textbox.Text = s
textbox.SelectionStart = textbox.Text.Length
無事、入力することが出来ました。
ねろさん、じゃんぬねっとさんありがとうございました。
またまた、ねろさん、すみません。
後者のコードも参考にさせていただきます。
ありがとうございます。
補足ですが、できれば、数値のオーバーフローや数値のキャストミスによるものは、
例外処理に頼らず事前に処理できるようにした方がよいです。
理由は初回例外のインスタンス生成に手間取り、画面が固まるからです。
例外処理以前に防げるものは、ロジックで防ぐのは VB6 も同じですね。
具体的には自作の IsNumeric 関数を使うか、
Double.TryParse などを使うことになします。
理由は初回例外のインスタンス生成に手間取り、画面が固まるからです。
私の環境では固まることは無いのですが。(^^;
>例外処理以前に防げるものは、ロジックで防ぐのは VB6 も同じですね。
趣旨には賛成ですが、
Dim Top = 5, Bottom = 0, Result As Integer
Try
Result = Top / Bottom
Catch Exc As System.OverflowException
MsgBox("Attempt to divide by zero resulted in overflow")
End Try
Dim x As Integer = 0
Try
Dim y As Integer = 100 / x
Catch e As ArithmeticException
Console.WriteLine("ArithmeticException Handler: {0}", e.ToString())
Catch e As Exception
Console.WriteLine("Generic Exception Handler: {0}", e.ToString())
End Try
MSDNにはこんなサンプルもありますし、
Try
'何かの処理
Catch When Err.Number = 4
'4番のエラーの処理
Catch
'その他の処理
End Try
の様な構文もあります。
ええ、ありますね。(^^)
あくまでサンプルコードはサンプルコードですか。
仮に、例外より前にロジックで除いたとしても、
例外処理は入れておきますけどね。
MSDN でもっとビックリしたのは、COM の破棄の仕方が、
ガベコレ使ってやっていた例があったことですね。
>あくまでサンプルコードはサンプルコードですか。
いやそのような意味ではなく、Try〜Catchには、積極的に
Tryに式を評価させ、Catchで例外処理をさせようという使い方を
可能にしていると言うことで、そのようなサンプルはがさがさ。。
>MSDN でもっとビックリしたのは、COM の破棄の仕方が、
>ガベコレ使ってやっていた例があったことですね。
MSDN のサンプルにひどいのが有るということに関しては
激しく同意なのですが。。。
通常アンマネージドのCOMはガベージコレクションの対象外かと。
COMは参照が無くなった時に破棄される、ただし.NETからCOMを
呼び出す時は.NETのラッパークラスがCOMをラップするのだが、この
ラッパーが曲者で、破棄されるまでCOMの参照のハンドルを放さない、
従ってこのラッパーがガベージコレクションで破棄されるまで
使わなくなったCOMがメモリー上に残ることになる。
ただし明示的にガベージコレクションを呼び出せば、使わなくなった
ラッパーは破棄されその結果、参照されていたCOMも破棄されるのでは。
従って間接的にガベージコレクションでCOMの開放は有りかと思うのだが、
そもそもそれが間違いなのですか。
COMの参照カウンターをデクリメントする方法もあるが、もともと
ガベージコレクションは参照カウンターの誤動作を防ぐ意味もあったと思われ
ちょっと気持ちが悪い気も、両方やるのがいいのかしら。。。。
ツイート | ![]() |