Esempio n. 1
0
 private static bool ProcessTerminal_CT(ref NumberSpanRawInfo raw, NumberSpanStandardStyles style, ref NumberSpanResult result)
 {
     if (raw._sepCount != 3 || raw._numCount != 2 || (style & NumberSpanStandardStyles.RequireFull) != NumberSpanStandardStyles.None)
     {
         result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
         return false;
     }
     bool invariant = (style & NumberSpanStandardStyles.Invariant) != NumberSpanStandardStyles.None;
     bool localized = (style & NumberSpanStandardStyles.Localized) != NumberSpanStandardStyles.None;
     bool positive = false;
     bool match = false;
     if (invariant)
     {
         if (raw.FullCTMatch(raw.PositiveInvariant))
         {
             match = true;
             positive = true;
         }
         if (!match && raw.FullCTMatch(raw.NegativeInvariant))
         {
             match = true;
             positive = false;
         }
     }
     if (localized)
     {
         if (!match && raw.FullCTMatch(raw.PositiveLocalized))
         {
             match = true;
             positive = true;
         }
         if (!match && raw.FullCTMatch(raw.NegativeLocalized))
         {
             match = true;
             positive = false;
         }
     }
     long num;
     if (match)
     {
         if (!TryNumberToTicks(positive, raw._numbers[0], raw._numbers[1], _zero, out num))
         {
             result.SetFailure(ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge");
             return false;
         }
         if (!positive)
         {
             num = -num;
             if (num > 0)
             {
                 result.SetFailure(ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge");
                 return false;
             }
         }
         result._parsedNumberSpan._ticks = num;
         return true;
     }
     result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
     return false;
 }
Esempio n. 2
0
 private static bool ProcessTerminalState(ref NumberSpanRawInfo raw, NumberSpanStandardStyles style, ref NumberSpanResult result)
 {
     if (raw._lastSeenTTT == TTT.Num)
     {
         var tok = new NumberSpanToken
         {
             _ttt = TTT.Sep,
             _sep = string.Empty
         };
         if (!raw.ProcessToken(ref tok, ref result))
         {
             result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
             return false;
         }
     }
     switch (raw._numCount)
     {
         case 1: return ProcessTerminal_C(ref raw, style, ref result);
         case 2: return ProcessTerminal_CT(ref raw, style, ref result);
         case 3: return ProcessTerminal_FULL(ref raw, style, ref result);
     }
     result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
     return false;
 }
Esempio n. 3
0
 private static bool TryParseNumberSpan(string input, NumberSpanStandardStyles style, IFormatProvider formatProvider, ref NumberSpanResult result)
 {
     if (input == null)
     {
         result.SetFailure(ParseFailureKind.ArgumentNull, "ArgumentNull_String", null, "input");
         return false;
     }
     input = input.Trim();
     if (input == string.Empty)
     {
         result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
         return false;
     }
     var tokenizer = new NumberSpanTokenizer();
     tokenizer.Init(input);
     var raw = new NumberSpanRawInfo();
     raw.Init(); //DateTimeFormatInfo.GetInstance(formatProvider));
     for (var token = tokenizer.GetNextToken(); token._ttt != TTT.End; token = tokenizer.GetNextToken())
         if (!raw.ProcessToken(ref token, ref result))
         {
             result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
             return false;
         }
     if (!tokenizer.EOL)
     {
         result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
         return false;
     }
     if (!ProcessTerminalState(ref raw, style, ref result))
     {
         result.SetFailure(ParseFailureKind.Format, "Format_BadNumberSpan");
         return false;
     }
     return true;
 }