wchar_t* pEnd = null;
int len = s.GetLength();
- SysTryReturn(NID_BASE, (len > 0), E_NUM_FORMAT, E_NUM_FORMAT, "[E_NUM_FORMAT] The length of s MUST be greater than 0.");
+ SysTryReturnResult(NID_BASE, (len > 0), E_NUM_FORMAT, "[%s] The length of s MUST be greater than 0.",
+ GetErrorMessage(E_NUM_FORMAT));
+
+ return Parse(s, Character::RADIX_DECIMAL, ret);
+}
+
+result
+LongLong::Parse(const String& s, int radix, long long& ret)
+{
+ SysTryReturnResult(NID_BASE, radix == Character::RADIX_BINARY || radix == Character::RADIX_OCTAL ||
+ radix == Character::RADIX_DECIMAL || radix == Character::RADIX_HEXADECIMAL, E_OUT_OF_RANGE,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_OUT_OF_RANGE), radix);
+
+ wchar_t* pEnd = null;
+
+ int len = s.GetLength();
+ SysTryReturnResult(NID_BASE, (len > 0), E_NUM_FORMAT, "[%s] The length of s MUST be greater than 0.",
+ GetErrorMessage(E_NUM_FORMAT));
errno = 0;
- ret = wcstoll(s.GetPointer(), &pEnd, 10);
- SysTryReturn(NID_BASE, (!(ret == 0 && errno == EINVAL) && (pEnd[0] == 0)), E_NUM_FORMAT, E_NUM_FORMAT,
- "[E_NUM_FORMAT] LongLong parse failed. Scan stopped at (%ls)",
- pEnd);
- SysTryReturn(NID_BASE, !(errno == ERANGE && (ret == LLONG_MAX || ret == LLONG_MIN)), E_NUM_FORMAT, E_NUM_FORMAT,
- "[E_NUM_FORMAT] Parsed value cannot fit into a LongLong.");
+ ret = wcstoll(s.GetPointer(), &pEnd, radix);
+ SysTryReturnResult(NID_BASE, (pEnd[0] == 0), E_NUM_FORMAT, "[%s] LongLong parse failed. Scan stopped at (%ls).",
+ GetErrorMessage(E_NUM_FORMAT), pEnd);
+ SysTryReturnResult(NID_BASE, !(errno == ERANGE && (ret == LLONG_MAX || ret == LLONG_MIN)), E_NUM_FORMAT,
+ "[%s] Parsed value cannot fit into a long long.", GetErrorMessage(E_NUM_FORMAT));
return E_SUCCESS;
}