2015-07-15 6 views
-1

Итак, один из наших проектов для одного из наших клиентов позволяет печатать чеки. Одно из полей, которые идут на проверку, - это номер чека. В настоящее время мы сохраняем номера чеков (для целей отчетности) в базе данных как тип int.Инкрементный номер из строки

Проблема в том, что клиент хочет увеличить размер номера чека до 20 цифр. Одной из особенностей проекта является автоматическое присвоение контрольных номеров каждой проверке при печати нескольких проверок.

Так, например, они печатают 3 чека. Они вводят начальный контрольный номер как «100123», а затем нажмите кнопку «Назначить контрольные номера» в точке «ведьма». Первая проверка, которую нужно распечатать, получает введенный «100123», и каждой следующей проверке присваивается одинаковое число, увеличенное на один так вторая проверка получит «100124», третий получит «100125» и так далее.

Проблема в том, что они хотят иметь 20-значный контрольный номер, который слишком велик для любого числового типа данных. Мое единственное решение - изменить номер проверки на строку/varchar, но это приведет к поломке процесса «Назначить контрольные номера» для нескольких проверок, поскольку я не могу увеличить строку, чтобы получить следующий номер.

Любые идеи о том, как я мог бы выполнить такое требование?

+1

Почему они хотят 20-значный номер чека? Может ли такое число соответствовать линии MICR? – Amy

+1

Вы пробовали 'BigInteger'? https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx – Dmitry

+0

[Десятичный] (https://msdn.microsoft.com/en-us/library /364x0z75.aspx) поддерживает 28 - 29 значащих цифр. – crashmstr

ответ

2

Используйте либо BigInteger, либо используйте decimal, так как оба имеют более чем требуемую точность.

1

Фактически диапазон ulong составляет от 0 до 18,446,744,073,709,551,615, что составляет 20 цифр. Я предполагаю, что не будет никаких «отрицательных» номеров чеков. До тех пор, как первые два номера чека меньше 17, вы можете сделать это:

ulong checkNumber = ulong.Parse(textCheckNumber); 
checkNumber++; 
string newCheckNumber = checkNumber.ToString(); 

Если есть вероятность того, что первые две цифры больше или равен 17, то вы можете сделать это :

ulong checkNumber = ulong.Parse(textCheckNumber.SubString(2)); 
checkNumber++; 
string newCheckNumber = textCheckNumber.SubString(0,2) + checkNumber; 
+0

Я забыл про ulong (не использовать тип много). Тем не менее, именно 20, которые, как вы сказали, могут вызвать проблему с первыми двумя цифрами. Ваш код для преобразования в числовое значение и приращение в настоящее время - это то, что мы делаем для int. Я не знаю, насколько велики первые две цифры, но если приращение переносится на первые две цифры, тогда процесс инкремента будет запущен. – James

+0

Кроме того, есть ли эквивалент базы данных ulong? – James

+0

@James - Какой сервер баз данных вы используете? – Icemanind

0

Вы можете использовать long. Его максимальное значение равно 2(^64)-1.

+0

Длинные разделены пополам. Половина для отрицательных и половины для положительных. – James

+0

Возможно, вы хотите использовать unsigned long, чтобы получить все значения в виде положительных чисел –

0

Благодарим за отзыв всем.

Сохранение базы данных как varchar должно быть в порядке. Вот что я придумал для приращения, основанного на обратной связи каждого.

string sampleNum = "01999999999999999997"; 

for (int i = 0; i < 5; i++) 
{ 
    int first = int.Parse(sampleNum.Substring(0, 2)); 
    ulong rest = ulong.Parse(sampleNum.Substring(2)); 

    rest++; 
    if (rest > 999999999999999999) 
    { 
     first++; 
     rest = 0; 
    } 

    sampleNum = first.ToString().PadLeft(2, '0') + rest.ToString().PadLeft(18, '0'); 

    Console.WriteLine(sampleNum); 
} 

Вот что я получил в тесте:

01999999999999999998 
01999999999999999999 
02000000000000000000 
02000000000000000001 
02000000000000000002 
Смежные вопросы