void DateTimeNumericFieldElement::handleKeyboardEvent(KeyboardEvent* keyboardEvent) { if (isReadOnly()) return; if (keyboardEvent->type() != eventNames().keypressEvent) return; UChar charCode = static_cast<UChar>(keyboardEvent->charCode()); if (charCode < ' ') return; DOMTimeStamp delta = keyboardEvent->timeStamp() - m_lastDigitCharTime; m_lastDigitCharTime = 0; String number = convertFromLocalizedNumber(String(&charCode, 1)); const int digit = number[0] - '0'; if (digit < 0 || digit > 9) return; keyboardEvent->setDefaultHandled(); setValueAsInteger(m_hasValue && delta < typeAheadTimeout ? m_value * 10 + digit : digit, DispatchEvent); if (m_value * 10 > m_range.maximum) focusOnNextField(); else m_lastDigitCharTime = keyboardEvent->timeStamp(); }
bool LocaleWin::isLocalizedDigit(UChar ch) { String normalizedDigit = convertFromLocalizedNumber(String(&ch, 1)); if (normalizedDigit.length() != 1) return false; return isASCIIDigit(normalizedDigit[0]); }
String NumberInputType::convertFromVisibleValue(const String& visibleValue) const { if (visibleValue.isEmpty()) return visibleValue; // We don't localize scientific notations. if (visibleValue.find(isE) != notFound) return visibleValue; return convertFromLocalizedNumber(visibleValue); }
// Returns -1 if parsing fails. int LocaleWin::parseNumber(const String& input, unsigned& index) { unsigned digitsStart = index; while (index < input.length() && isASCIIDigit(input[index])) index++; if (digitsStart != index) { bool ok = false; int number = input.substring(digitsStart, index - digitsStart).toInt(&ok); return ok ? number : -1; } while (index < input.length() && isLocalizedDigit(input[index])) index++; if (digitsStart == index) return -1; bool ok = false; int number = convertFromLocalizedNumber(input.substring(digitsStart, index - digitsStart)).toInt(&ok); return ok ? number : -1; }