2010-01-07 6 views
0

Мне нужно иметь дело с числовым значением (исходящим из числового столбца SQL Server 2005), которое мне нужно преобразовать в строку, с оговоркой, что десятичная точка должна быть удалена. Сами данные доступны в C# через DataTable/DataRow.Хороший способ перевести числовое значение в строку с удалением десятичной точки?

Например, если столбец SQL Server читает 12345.678, строка должна быть «12345678», когда все сказано и сделано. Можно ли указать мне на хороший подход для этого? Может быть, есть метод преобразования .Net, который делает это, я не уверен.

Спасибо!

+0

Одна вещь, на которую не обращается ни один из ответов, заключается в том, что в преобразованной строке может быть научная нотация. Вам тоже нужно избавиться? – PeterAllenWebb

ответ

3

, что о чем-то вроде

var numberWithPoint = dbGetNumber(); 

string numberWithOutPoint = numberWithPoint.ToString().Replace(".", string.Empty); 

это быстро и грязно, но получить работу довольно просто.

+1

...и это не работает, если текущая культура использует что-то иное, чем период как десятичный разделитель. – Guffa

+1

OP никогда не указывал обработку нескольких культур в качестве требования. –

+0

@ Давид: Он попросил «хороший подход», и я не считаю его хорошим подходом, если он ломается, когда меняется текущая культура ... – Guffa

1

Прямолинейный метод заключается в использовании

string result = original.Replace(".", "") 

Там может быть более быстрый способ, но если это не в напряженном внутреннем цикле, замена должна работать нормально.

EDIT: Fixed пример кода, плюс:

Для решения проблем культуры, можно было бы использовать NumberFormatInfo.NumberDecimalSeparator для определения текущего заданного десятичного разделителя.

+0

ha! побей меня на секунду! –

+0

Ух ты, рад, что у меня была эта чашка кофе сегодня утром ;-) –

+0

Хотя нет Замены, которое принимает 3 параметра. –

2

вы можете сделать это в C#, как:

var myNum = 12345.678; 
var myString = myNum.ToString().Replace(".",""); 

в SQL Server, вы можете сделать это нравится:

SELECT REPLACE(cast(myCol as varchar), '.', '') as FormattedNumber 
FROM ... 
+0

Версия C# не работает, если текущая культура использует что-то иное, кроме периода как десятичное разделитель. – Guffa

+0

десятичное значение всегда может быть заменено на 'CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator', если культура является проблемой, хотя она не упоминалась. – dan

2

насчет:

// using System.Globalization; 
SqlCommand cm = new SqlCommand("SELECT 12345.678 as decimal"); 
// ... 
SqlDataReader dr = cm.ExecuteReader(); 
if(dr.Read()) 
{ 
    string value = dr.GetValue(0).ToString() 
     .Replace(NumberFormatInfo.CurrentInfo.NumberDecimalSeparator, "") 
} 
+2

могу я спросить, почему downvote? –

+0

+1 - Почему это проголосовало? SqlDataReader не так страшно .... – Omar

+0

Просто поместите 'SqlDataReader', потому что OP сказал« числовое значение, поступающее с SQL Server »; и эта версия касается вопросов культуры –

4

Есть несколько возможных подходы. Вы можете преобразовать его в строку, используя определенную культуру, так что вы уверены, что период используется в качестве десятичного разделителя, а затем удалить период:

string s = num.ToString(CultureInfo.InvariantCulture).Replace(".", String.Empty); 

Вы могли бы использовать более числовой подход умножить valye на 10 пока нет десятичные:

while (num != Math.Floor(num)) num *= 10.0; 
string s = ((int)num).ToString(); 
+0

+1 cleaver Математическое решение –

+0

Очень умный. Спасибо, Гуффа. – larryq

1

но, как правило, когда речь идет от SQL сервера, вы не должны преобразовать его первым в строку, чем целое число/двойной, но преобразовать его непосредственно из объекта в строке [ «cOLUMN1»] к необходимая ценность, это сэкономит вам проблемы с обработкой культур и улучшит производительность немного