int FirstDigit(int number) { if(number > 10) { return FirstDigit(number / 10); } else { return number; } }
InputIterator ConvertStringToIntegerRadix( InputIterator Beg, InputIterator End, T &Val ) { Detail::TRadixAbstraction<T, RadixValue> RA; //В связи с тем что все символы для проверки которые используются в этой функции в UNICODE представлении //имеют тот же код что и в ANSI (только 16 битный) можно использовать одну функцию как для UNICODE так и для //ANSI строк bool IsNegate = false; InputIterator BegBack(Beg); //Сохраняем позицию начального итератора Val = 0; //Пропускаем пробелы while( Beg != End && (*Beg == '\t' || *Beg == ' ' ) ) ++Beg; if( Beg == End ) return BegBack; //Разбираемся со знаком if( *Beg == '-' ) { IsNegate = true; ++Beg; } else if( *Beg == '+' ) { ++Beg; } InputIterator FirstDigit(Beg); //Сохраняем позицию предполагаемой первой цифры //Начинаем обрабатывать цифры T curDigit; while( Beg != End && RA.toVal(*Beg, curDigit) ) { Val = RA.radix() * Val + curDigit; ++Beg; } if( Beg == FirstDigit ) //Мы не преобразовали не одну цифру return BegBack; #pragma warning( push ) #pragma warning( disable: 4146 ) if( IsNegate ) Val = -Val; #pragma warning( pop ) return Beg; }
InputIterator ConvertIntegerToStringRadix( T Val, InputIterator Beg, InputIterator End ) { Detail::TRadixAbstraction<T, RadixValue> RA; typedef typename std::iterator_traits<InputIterator>::value_type TChar; InputIterator Cur(Beg); //Текущий символ InputIterator FirstDigit(Beg); //Первая записанная цифра if( Val < 0 ) //Если число отрицательное выводим знак { if( Cur == End ) return Beg; #pragma warning( push ) #pragma warning( disable: 4146 ) Val = -Val; #pragma warning( pop ) *Cur = '-'; ++Cur; ++FirstDigit; } do { if( Cur == End ) return Beg; *Cur = RA.template toChar<TChar>( Val % RA.radix() ); ++Cur; Val /= RA.radix(); } while( Val > 0 ); InputIterator RetVal(Cur); //Итератор стоящий за последним записанным символом //Мы получили перевёрнутое число. Восстанавливаем нормальный порядок --Cur; TChar Tmp; while( FirstDigit < Cur ) { Tmp = *Cur; *Cur = *FirstDigit; *FirstDigit = Tmp; ++FirstDigit; --Cur; } return RetVal; }
int CyclicShift(int number) { return AllDigitsWithoutFirst(number) * 10 + FirstDigit(number); }