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; }
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; }
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; }