private HaystackToken ReadNumber() { string strDecNumSep = _numberFormat.NumberDecimalSeparator; char cNumSep = '.'; if (strDecNumSep.Length == 1) { cNumSep = strDecNumSep[0]; } bool bHex = false; if (_currentChar < 0) { err("unexpected eof in num"); } if (!(_currentChar < 0 || _peekChar < 0)) { // hex number (no unit allowed) bHex = (char)_currentChar == '0' && (char)_peekChar == 'x'; } bool bExit = false; if (bHex) { consume('0'); consume('x'); StringBuilder sb01 = new StringBuilder(); bExit = false; while (!bExit) { if (HaystackTokenizer.isHex(_currentChar)) { sb01.Append((char)_currentChar); consume(); } else if (_currentChar == '_') { consume(); } else { bExit = true; } } _currentValue = new HaystackNumber(long.Parse(sb01.ToString(), NumberStyles.AllowHexSpecifier)); return(HaystackToken.num); } // consume all things that might be part of this number token var builder = new StringBuilder().Append((char)_currentChar); consume(); int colons = 0; int dashes = 0; int unitIndex = 0; bool exp = false; bExit = false; while (!bExit) { if (_currentChar >= 0) // Check for eof { if (!char.IsDigit((char)_currentChar)) { if (exp && (_currentChar == '+' || _currentChar == '-')) { } else if (_currentChar == '-') { ++dashes; } else if ((_peekChar >= 0) && (_currentChar == ':') && (char.IsDigit((char)_peekChar))) { ++colons; } else if ((exp || colons >= 1) && _currentChar == '+') { } else if (_currentChar == cNumSep) { if (_peekChar >= 0) { if (!char.IsDigit((char)_peekChar)) { break; } } } else if ((_peekChar >= 0) && (((char)_currentChar == 'e' || (char)_currentChar == 'E') && ((char)_peekChar == '-' || (char)_peekChar == '+' || char.IsDigit((char)_peekChar)))) { exp = true; } else if (char.IsLetter((char)_currentChar) || _currentChar == '%' || _currentChar == '$' || _currentChar == '/' || _currentChar > 128) { if (unitIndex == 0) { unitIndex = builder.Length; } } else if ((_peekChar >= 0) && (_currentChar == '_')) { if (unitIndex == 0 && char.IsDigit((char)_peekChar)) { consume(); continue; } else { if (unitIndex == 0) { unitIndex = builder.Length; } } } else { bExit = true; } } } else { bExit = true; } if (!bExit) { builder.Append((char)_currentChar); consume(); } } if (dashes == 2 && colons == 0) { return(date(builder.ToString())); } if (dashes == 0 && colons >= 1) { return(time(builder, colons == 1)); } if (dashes >= 2) { return(dateTime(builder)); } return(number(builder.ToString(), unitIndex)); }
private HaystackToken num() { string strDecNumSep = m_numberFormat.NumberDecimalSeparator; char cNumSep = '.'; if (strDecNumSep.Length == 1) { cNumSep = strDecNumSep[0]; } bool bHex = false; if (m_cCur < 0) { err("unexpected eof in num"); } if (!(m_cCur < 0 || m_cPeek < 0)) { // hex number (no unit allowed) bHex = (char)m_cCur == '0' && (char)m_cPeek == 'x'; } bool bExit = false; if (bHex) { consume('0'); consume('x'); StringBuilder sb01 = new StringBuilder(); bExit = false; while (!bExit) { if (HaystackTokenizer.isHex(m_cCur)) { sb01.Append((char)m_cCur); consume(); } else if (m_cCur == '_') { consume(); } else { bExit = true; } } m_val = HNum.make(Int64.Parse(sb01.ToString(), System.Globalization.NumberStyles.AllowHexSpecifier)); return(HaystackToken.num); } // consume all things that might be part of this number token StringBuilder s = new StringBuilder().Append((char)m_cCur); consume(); int colons = 0; int dashes = 0; int unitIndex = 0; bool exp = false; bExit = false; while (!bExit) { if (m_cCur >= 0) // Check for eof { if (!char.IsDigit((char)m_cCur)) { if (exp && (m_cCur == '+' || m_cCur == '-')) { } else if (m_cCur == '-') { ++dashes; } else if ((m_cPeek >= 0) && (m_cCur == ':') && (char.IsDigit((char)m_cPeek))) { ++colons; } else if ((exp || colons >= 1) && m_cCur == '+') { } else if (m_cCur == cNumSep) { if (m_cPeek >= 0) { if (!char.IsDigit((char)m_cPeek)) { break; } } } else if ((m_cPeek >= 0) && (((char)m_cCur == 'e' || (char)m_cCur == 'E') && ((char)m_cPeek == '-' || (char)m_cPeek == '+' || char.IsDigit((char)m_cPeek)))) { exp = true; } else if (char.IsLetter((char)m_cCur) || m_cCur == '%' || m_cCur == '$' || m_cCur == '/' || m_cCur > 128) { if (unitIndex == 0) { unitIndex = s.Length; } } else if ((m_cPeek >= 0) && (m_cCur == '_')) { if (unitIndex == 0 && char.IsDigit((char)m_cPeek)) { consume(); continue; } else { if (unitIndex == 0) { unitIndex = s.Length; } } } else { bExit = true; } } } else { bExit = true; } if (!bExit) { s.Append((char)m_cCur); consume(); } } if (dashes == 2 && colons == 0) { return(date(s.ToString())); } if (dashes == 0 && colons >= 1) { return(time(s, colons == 1)); } if (dashes >= 2) { return(dateTime(s)); } return(number(s.ToString(), unitIndex)); }