02Igarashi01
@02Igarashi01

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

TryParse C#

解決したいこと

TryParseが何故かコンマ(,)を無視して十進相数では無く整数に変換してしまう理由を知りたい。
例えば4,5と入力すれば45認識される
4.5と入力すると正しく認識される

やはり、.NetFrameworkのバグですか?

発生している問題・エラー

有りません

スクリーンショット 2023-01-07 232148.png

該当するソースコード

 private void txtNota1_Leave(object sender, EventArgs e)
        {

            verifica = float.TryParse(txtNota1.Text, out nota1);
            if (verifica == false)
            {
                MessageBox.Show("Formato de valor inválido na nota 1,digite novamente");
                txtNota1.Clear();
                txtNota1.Focus();
                return;
            }
        }

自分で試したこと

floatの代わりにdouble使ってみたが、結果は同じ。

0

日本やアメリカでは,は「桁区切り記号」として使われることが一般的なため、小数点扱いする方が圧倒的に「バグだ!」と言われますよ。
だから仕様です。

数値の書き方は国によって大きく違い、.NETはその違いを吸収する仕組みとして(数値書式に関しては)NumberFormatInfo クラスを用意しています。
何を小数点の記号とするかはNumberDecimalSeparator プロパティで指定しますが、複数指定はできません。(出力時にどれを使えばいいのかわからなくなるからしょうがない)

そんなわけで.,のどちらも小数点扱いしてほしいなら
verifica = float.TryParse(txtNota1.Text.Replace(',', '.'), out nota1);
と書くくらいしか手がなさそうですね。

3Like

なるほど、間違ってなければ、確かにConvertの場合はコンマ(,)を使えばエラーに成りますが、何故そんな違いが有りますか?

0Like

やはり、.NetFrameworkのバグですか?

いいえ、バグではありません。仕様です。

国によって数字の区切り方のルールが違うので(以下の記事参照)、

世界各国での数字の区切り方、カンマ・コンマのルール
https://coliss.com/articles/build-websites/operation/writing/53.html

それに対応するには、TryParse メソッドでカルチャを指定できるオーバーロードを使ってください。

TryParse(String, NumberStyles, IFormatProvider, Single)
https://learn.microsoft.com/ja-jp/dotnet/api/system.single.tryparse?view=netframework-4.8#system-single-tryparse(system-string-system-globalization-numberstyles-system-iformatprovider-system-single@)

具体例:

using System;
using System.Globalization;

namespace ConsoleApp5
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string stringValue;
            float floatValue;
            CultureInfo ci;

            // フランス
            stringValue = "123 456,78";
            ci = new CultureInfo("fr-FR");
            float.TryParse(stringValue, 
                           NumberStyles.AllowThousands | NumberStyles.Float, 
                           ci, 
                           out floatValue);
            Console.WriteLine($"France: {floatValue}");

            // イタリア
            stringValue = "123.456,78";
            ci = new CultureInfo("it-IT");
            float.TryParse(stringValue, 
                           NumberStyles.AllowThousands | NumberStyles.Float, 
                           ci, 
                           out floatValue);
            Console.WriteLine($"Italy: {floatValue}");
        }
    }
}

実行結果は:

France: 123456.8
Italy: 123456.8

1Like

Your answer might help someone💌