2015-07-09 4 views
0

Я столкнулся с ситуацией, которая, по моему мнению, находится за пределами того, что вы можете делать с помощью строк пользовательского формата.десятичная строка пользовательского формата с фиксированной точностью и отсутствием периода

Но код, который я написал, настолько груб, что я думал, что все равно спрошу.

Что мне нужно для десятичного будет отображаться либо в виде 6 или 7 цифр строки, например:

number = 12345.67M 
(optional) 
tenthousands thousands hundreds tens ones tenths hundredths 
    1   2   3  4 5  6  7 

Вот код, который я написал для достижения этой цели:

public static string ConvertDecimalToString(decimal easting, int length) 
{ 
    var formatString = "{0:0000.00}"; 
    var numberAsString = string.Format(formatString, easting); 
    var removePeriod = numberAsString.Replace(".", ""); 

    if (removePeriod.Length > length) 
    { 
     return removePeriod.Substring(removePeriod.Length - length, length); 
    } 
    else 
    { 
     return removePeriod.PadLeft(length, '0'); 
    } 
} 

Ожидаемые входы и выходы:

Input   Output(6) Output(7) 
912345.67M  234567  1234567 
12345.67M  234567  1234567 
1234.56M  123456 
1234.5M   123450 
1234M   123400 
234M   023400  0023400 
+0

Итак, каков ваш ожидаемый результат для ввода = 12345.67M и input = 1234.56M? –

+0

Почему, по-вашему, пользовательские форматированные строки не будут работать? – Tim

+0

В чем причина «234567» (первый результат (6)). то есть удаление (очень) значащих цифр? – DrKoch

ответ

0

Если я вас правильно понял, вы хотите разделить число на сегментном табло

ул = number.ToSting() даст строку вы можете перебирать и создать свой номер

str.split («») даст вам обе стороны от числа Тогда вы сможете построить свой номер stribg динамически без форсирования формата

1

Если вы хотите десятичную 12345.67 отображается как 1234567 (просто опустить десятичную точку) использовать этот трюк:

decimal number = 12345.67M; 
string s = string.Format("{0:0000000}", number * 100.0); 

Или

string s = string.Format("{0:F0}", number * 100.0); // zero decimal places 

Мораль: Не возиться со строкой, полученной из форматирования, изменить значение входного вместо и пусть форматирование делать свою работу.

+0

См. Также: http://stackoverflow.com/questions/29294501/print-constant-exponent-value-using-printf-in-c/29294667#29294667 – DrKoch

+0

Это, похоже, не обрабатывает максимальную длину строки, но это исключает замену строки за счет умножения. Во всяком случае, (и я действительно не пытаюсь быть воинственным здесь, в случае, если тон встречается как мгновенный), это не доказывает, что позволить строке формата выполнять работу. – Coxy

+0

@Coxy В общем случае у вас есть разный десятичный разделитель (',' в Германии), который форматирует правильно, но не заменяет вашу строку. Это всего лишь один пример для основополагающих рассуждений. – DrKoch