Преобразование строки в double в С#
У меня есть строка с двойными значениями ("value1 # value2 # value3 #...).
Я разделил его на таблицу строк. Затем я хочу преобразовать элемент из этой таблицы в double, и я получу ошибку n. Что не так? Как я могу получить из этой строки (строки a) значения в двойном типе?
string a = "52.8725945#18.69872650000002#50.9028073#14.971600200000012#51.260062#15.5859949000000662452.23862099999999#19.372202799999250800000045#51.7808372#19.474096499999973#";
string[] tablicaLatLng = a.Split(new char[] { '#' });
for (int i = 0; i < tablicaLatLng.Length; i++)
{
Console.WriteLine(tablicaLatLng[i]);
}
Console.WriteLine(tablicaLatLng[0]); // 52.8725945
Convert.ToDouble(tablicaLatLng[0]); // error
Ответы
Ответ 1
В случае вашего первого двойного (как вы его просите): кажется, это проблема, связанная с культурой, попробуйте это, она должна работать (заменив .
на ,
):
Console.WriteLine(Convert.ToDouble("52,8725945"));
В таком случае вы должны проанализировать свою строку, например. double.Parse
:
double.Parse("52.8725945", System.Globalization.CultureInfo.InvariantCulture);
С другой стороны, у вас неверный двойник позже в вашей строке.
Ответ 2
Большинство людей уже пытались ответить на ваши вопросы.
Если вы все еще отлаживаете, подумали ли вы об использовании:
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
Надеюсь, что это поможет.
Ответ 3
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);
Ответ 4
Добавить класс как общедоступный и использовать его очень легко, как 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());
Ответ 5
В вашей строке я вижу: 15.5859949000000662452.23862099999999
, который не является двойным (он имеет две десятичные точки). Возможно, это просто законная ошибка ввода?
Вам также может понадобиться выяснить, будет ли ваш последний String
пустым и учитывать эту ситуацию.