#
-value1#value2#value3#
などで区切られたダブルタイプの値を持つ長い文字列があります
文字列テーブルに分割しました。次に、このテーブルのすべての要素をdouble型に変換すると、エラーが発生します。ここで型変換の何が問題になっていますか?
string a = "52.8725945#18.69872650000002#50.9028073#14.971600200000012#51.260062#15.5859949000000662452.23862099999999#19.372202799999250800000045#51.7808372#19.474096499999973#";
string[] someArray = a.Split(new char[] { '#' });
for (int i = 0; i < someArray.Length; i++)
{
Console.WriteLine(someArray[i]); // correct value
Convert.ToDouble(someArray[i]); // error
}
3つの問題があります。
1)小数点区切り文字が正しくない
カルチャごとに異なる小数点区切り文字(つまり、,
および.
)が使用されます。
.
を,
に置き換えると、期待どおりに動作するはずです。
Console.WriteLine(Convert.ToDouble("52,8725945"));
カルチャを2番目のパラメーターとして使用するオーバーロードメソッドを使用して、doubleを解析できます。この場合、InvariantCulture
( 不変カルチャとは何ですか )を使用できます。 double.Parse
を使用:
double.Parse("52.8725945", System.Globalization.CultureInfo.InvariantCulture);
また、 double.TryParse
を確認する必要があります。多くのオプションで使用でき、文字列が有効なdouble
であるかどうかを確認するのに特に役立ちます。
2)間違ったdoubleがあります
2つのドットが含まれているため、値の1つが正しくありません。
15.5859949000000662452.23862099999999
3)配列の最後に空の値がありますが、これは誤ったdoubleです
空の値を削除するオーバーロードSplit
を使用できます。
string[] someArray = a.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);
クラスをPublicとして追加し、convertToInt32()のように非常に簡単に使用します
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for Common
/// </summary>
public static class Common
{
public static double ConvertToDouble(string Value) {
if (Value == null) {
return 0;
}
else {
double OutVal;
double.TryParse(Value, out OutVal);
if (double.IsNaN(OutVal) || double.IsInfinity(OutVal)) {
return 0;
}
return OutVal;
}
}
}
次に、関数を呼び出します
double DirectExpense = Common.ConvertToDouble(dr["DrAmount"].ToString());
ほとんどの人はすでにあなたの質問に答えようとしました。
まだデバッグしている場合は、以下を使用することを考えましたか?
Double.TryParse(String, Double);
これは、実際の解析を行う前に、まず各文字列の何が間違っているかを判断するのに役立ちます。
文化に関連する問題がある場合は、次の使用を検討してください。
Double.TryParse(String, NumberStyles, IFormatProvider, Double);
この http://msdn.Microsoft.com/en-us/library/system.double.tryparse.aspx には、それらの使用方法に関する非常に良い例があります。
長い必要がある場合は、Int64.TryParseも利用できます。 http://msdn.Microsoft.com/en-us/library/system.int64.tryparse.aspx
お役に立てば幸いです。
private double ConvertToDouble(string s)
{
char systemSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
double result = 0;
try
{
if (s != null)
if (!s.Contains(","))
result = double.Parse(s, CultureInfo.InvariantCulture);
else
result = Convert.ToDouble(s.Replace(".", systemSeparator.ToString()).Replace(",", systemSeparator.ToString()));
}
catch (Exception e)
{
try
{
result = Convert.ToDouble(s);
}
catch
{
try
{
result = Convert.ToDouble(s.Replace(",", ";").Replace(".", ",").Replace(";", "."));
}
catch {
throw new Exception("Wrong string-to-double format");
}
}
}
return result;
}
成功したテストは次のとおりです。
Debug.Assert(ConvertToDouble("1.000.007") == 1000007.00);
Debug.Assert(ConvertToDouble("1.000.007,00") == 1000007.00);
Debug.Assert(ConvertToDouble("1.000,07") == 1000.07);
Debug.Assert(ConvertToDouble("1,000,007") == 1000007.00);
Debug.Assert(ConvertToDouble("1,000,000.07") == 1000000.07);
Debug.Assert(ConvertToDouble("1,007") == 1.007);
Debug.Assert(ConvertToDouble("1.07") == 1.07);
Debug.Assert(ConvertToDouble("1.007") == 1007.00);
Debug.Assert(ConvertToDouble("1.000.007E-08") == 0.07);
Debug.Assert(ConvertToDouble("1,000,007E-08") == 0.07);
あなたの文字列で私は見ます:15.5859949000000662452.23862099999999
は倍精度ではありません(小数点が2つあります)。おそらくそれは正当な入力エラーですか?
また、最後のString
が空になるかどうかを把握し、その状況を説明することもできます。