Преобразование строки в double в C#
У меня есть длинная строка со значениями двойного типа, разделенными #
-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
}
5 ответов
Есть 3 проблемы.
1) Неверный десятичный разделитель
Различные культуры используют разные десятичные разделители (а именно ,
а также .
).
Если вы замените .
с ,
он должен работать как положено:
Console.WriteLine(Convert.ToDouble("52,8725945"));
Вы можете проанализировать ваши двойники, используя перегруженный метод, который принимает культуру в качестве второго параметра. В этом случае вы можете использовать InvariantCulture
( Что такое инвариантная культура), например, используя double.Parse
:
double.Parse("52.8725945", System.Globalization.CultureInfo.InvariantCulture);
Вы также должны взглянуть на double.TryParse
, вы можете использовать его со многими опциями, и это особенно полезно, чтобы проверить, является ли ваша строка действительной double
,
2) у вас неправильный дубль
Одно из ваших значений неверно, потому что оно содержит две точки:
15.5859949000000662452.23862099999999
3) Ваш массив имеет пустое значение в конце, которое является неправильным двойным
Вы можете использовать перегруженный 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);
Вы можете попробовать этот пример. Простая программа C# для преобразования строки в double
class Calculations{
protected double length;
protected double height;
protected double width;
public void get_data(){
this.length = Convert.ToDouble(Console.ReadLine());
this.width = Convert.ToDouble(Console.ReadLine());
this.height = Convert.ToDouble(Console.ReadLine());
}
}
В вашей строке я вижу: 15.5859949000000662452.23862099999999
который не является двойным (у него есть две десятичные точки). Возможно, это просто допустимая ошибка ввода?
Вы также можете выяснить, если ваш последний String
будет пусто, и объяснить эту ситуацию.