2016-05-18 10 views
0

3つの値があり、値の高いものから低いものにソートする必要があります。私はピリオドを使用するまで、魅力的に機能する以下のコードを使用します。 "カンマ "、"。 "1,3"と入力すると好きなように表示されますが、 "1.3"と入力すると13に変わります。エンドユーザーはカンマとピリオドの両方を使用できる必要があります。カンマまたはピリオドを含む数値の解析

どうすればこの問題を解決できますか?

Dim IntArr(2) As Decimal 
    IntArr(0) = TextBox1.Text 
    IntArr(1) = TextBox2.Text 
    IntArr(2) = TextBox3.Text 
    Array.Sort(IntArr) 

    Dim highestNum As Decimal 
    Dim Midelnum As Decimal 
    Dim lowestNum As Decimal 

    lowestNum = IntArr(0) 
    Midelnum = IntArr(1) 
    highestNum = IntArr(2) 

    MsgBox("Highest " & highestNum) 
    MsgBox("lowest " & lowestNum) 
    MsgBox("middel " & Midelnum) 
+0

?それは非常に混乱しているようです。 –

答えて

0

問題は文化に基づいているということです。あなたが記述したように数字を入力すると、逆効果(「1,3」→「13」など)が得られるので、私はこれを言う。

ここでは、現在のカルチャと一致するように値を変更する簡単な方法があります。

あなたのクラスの上部には、これを置く:

Imports System.Globalization 

を次に、あなたはこれを行うことができます。

Dim IntArr(2) As Decimal 

    Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat 
    Dim sep1 As String = nfi.NumberDecimalSeparator 
    Dim sep2 As String = If(sep1.Equals("."), ",", ".") 
    Dim useComma As Boolean = (TextBox1.Text.Contains(",") Or TextBox2.Text.Contains(",") Or TextBox3.Text.Contains(",")) 

    'Replace the separator to match the current culture for parsing 
    Decimal.TryParse(TextBox1.Text.Replace(sep2, sep1), IntArr(0)) 
    Decimal.TryParse(TextBox2.Text.Replace(sep2, sep1), IntArr(1)) 
    Decimal.TryParse(TextBox3.Text.Replace(sep2, sep1), IntArr(2)) 

    Array.Sort(IntArr) 

    sep1 = If(useComma, ",", ".") 
    sep2 = If(useComma, ".", ",") 

    'Reformat the results to match the user's input 
    Dim lowestNum As String = IntArr(0).ToString().Replace(sep2, sep1) 
    Dim middleNum As String = IntArr(1).ToString().Replace(sep2, sep1) 
    Dim highestNum As String = IntArr(2).ToString().Replace(sep2, sep1) 

    Dim msg As String = "Highest: {0}" & Environment.NewLine & _ 
         "Lowest: {1}" & Environment.NewLine & _ 
         "Middle: {2}" 

    msg = String.Format(msg, highestNum, lowestNum, middleNum) 

    MessageBox.Show(msg) 

をまた、あなたは.NETを使用しているので、あなたはスキップすることもできますVB6のやり方。私が使ったことを見てみるために私の例を参照してください。

+0

もちろん、数千を許可する場合は、簡単な置き換えの代わりに完全に異なるロジックを実行する –

+0

@Chriss大丈夫ですが、コンマとピリオドの混在を使用することができますが、ピリオドを使用すると出力がコンマで表示されます...ユーザーがコンマで値を入力すると、出力はコンマで区切られます入力はピリオドで出力されている期間です...しかし、あなたのように2つをミックスするのはいいです:D – TM80

+0

これを行うには、Decimal構文解析を機能させるためには最初の置換を行う必要がありますがそれを出力のために戻すことができます。 –

0

あなたはそれを保存する前に、文字列を変更するハック使用することができます

TextBox.Text.Replace(".",",") 

をしかし、あなたは、元の入力を表示したい場合は、入力した文字を検出するための変数持つことができ:

Dim isDot As Boolean = False 
    Dim number As String = TextBox.Text 

    If number.Contains(".") Then 
     isDot = True 
    End If 

最後に、表示のためだけに置き換えます。

If isDot Then 
     number.Replace(",",".") 
    End If 
+0

ええ、私はそれについて考えましたが、私はusserがそれらがカンサまたはピリオドであるかどうかを決定することができるようにします。 – TM80

+0

上記のソート方法を使用してください。ユーザーがドットを使用したいと言っている場合は、並べ替えの後に.Replace( "、"、 "。")を再置換するだけです。 – Veeke

0

受け入れられた答えは、あまりにも多くの不要な文字列操作を使用します。

Sub Main 
    Dim DecArr(2) As Decimal 

    'Select the input culture (German in this case) 
    Dim inputCulture As CultureInfo = CultureInfo.GetCultureInfo("de-DE") 

    Dim text1 As String = "1,2" 
    Dim text2 As String = "5,8" 
    Dim text3 As String = "4,567" 


    'Use the input culture to parse the strings. 
    'Side Note: It is best practice to check the return value from TryParse 
    '   to make sure the parsing actually succeeded. 
    Decimal.TryParse(text1, NumberStyles.Number, inputCulture, DecArr(0)) 
    Decimal.TryParse(text2, NumberStyles.Number, inputCulture, DecArr(1)) 
    Decimal.TryParse(text3, NumberStyles.Number, inputCulture, DecArr(2)) 

    Array.Sort(DecArr) 

    Dim format As String = "Highest: {0}" & Environment.NewLine & _ 
          "Lowest: {1}" & Environment.NewLine & _ 
          "Middle: {2}" 

    'Select the output culture (US english in this case) 
    Dim ouputCulture As CultureInfo = CultureInfo.GetCultureInfo("en-US") 

    Dim msg As String = String.Format(ouputCulture, format, DecArr(2), DecArr(1), DecArr(0)) 

    Console.WriteLine(msg) 
End Sub 

このコード出力:あなたが必要なものを得るために、CultureInfoオブジェクトを使用することができます

なぜあなた `Decimal`配列が` IntArr`命名され
Highest: 5.8 
Lowest: 4.567 
Middle: 1.2 
+0

あなたのメッセージは、最下位に最下位、最下位に、そして最上位が中間に置かれています。インデックスは2,0,1でなければなりません。また、OPのコメントを含め、私の答えの下で私たちの会話で "不要な文字列の操作"を説明しました。 "私が目指しているのは、ユーザーがコンマで値を入力すると入力がピリオドで出力されるピリオドの場合は、カンマで区切られます。私はここに誰かがこれを見て、コメントチェーン上でTL; DRに行く場合に明確にするためにコメントしています。 –

+0

良いキャッチ、私はそれを逃した。 –

関連する問題