0

こんにちは、以下のメソッドを使用して文字列に変換しますが、IE では例外を介して入力文字列が正しい形式ではありませんでした。 この行で

 s = TimeSpan.FromSeconds(Convert.ToDouble(time));

これらはそれに渡す値です

600, 298.8, 65505, 69, 70, 20.5, 20.5, 20.5, 20.5, 1840.4, 682, 1040.3

クロムでは機能しますが、IEではカルチャをフランス語に変更すると2番目の値で例外が発生します問題の原因を教えてください

public static String ConvertTimeToString(this string time)   
{

    if (String.IsNullOrEmpty(time))
    {
        return time;
    }

    TimeSpan s;

    if (time.IndexOf(':') >= 0)
    {
        s = TimeSpan.Parse(time);
    }
    else
    {
        s = TimeSpan.FromSeconds(Convert.ToDouble(time));
    }

    return s.ConvertTimeToString();
}    
4

2 に答える 2

1

IFormatProviderを使用する場合は、 を指定する必要がありますConvert.ToDouble(time)

Convert.ToDouble(time, CultureInfo.InvariantCulture)

を指定すると、 (ピリオドに注意してください) とCulturInfo.InvariantCulture書かれた浮動小数点を期待するカルチャが指定されます。1.234問題の原因はtime、フォーマットにある可能性があります1,234(カンマに注意してください)。または、その逆かもしれません: を指定せず、IFormatProviderASP.NET プロセスの現在のカルチャでは小数点記号としてコンマを使用していますが、提供された文字列ではピリオドが使用されていますか?

使用されている小数点が一貫していない場合は、ソースで修正するか (ソースがここにあるかわからない)、最後の手段としてコンマをピリオドに置き換える必要があります。

Convert.ToDouble(time.Replace(",", ".") , CultureInfo.InvariantCulture)

ただし、文字列を解析しようとして、何を期待するかを知らずに行うのは最善の方法ではありません。

于 2012-10-11T08:37:27.363 に答える
1

失敗はおそらく呼び出しにありますConvert.ToDouble。あなたのコードはおそらく、小数点として ',' を持つ CultureInfo で実行されますが、値は '.' を使用します。Double.TryParse「。」を持つ CultureInfo を使用することをお勧めします。代わりに小数点として:

Double value;
if (Double.TryParse(time, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out value))
{
    s = TimeSpan.FromSeconds(value);
}
于 2012-10-11T08:36:54.640 に答える