Jak dopuścić tylko 2 cyfry i 1 cyfrę po przecinku (.)?

Nov 21 2020

Mam taki problem, że nie potrafię zebrać tego, co właściwe RegExp. Moim celem jest dopuszczenie do 3 cyfr przed przecinkiem i TYLKO JEŻELI występuje ułamek dziesiętny, a po przecinku 1 cyfra. Którego RegExplub Regexes muszę użyć do tego zachowania?

Poszukiwane dozwolone wyniki: 000,0, 00,0, 0,0, 000, 00, 0

to jest obecny kod, ale problem polega na tym, że tutaj również można umieścić 4 cyfry bez dziesiętnego:

inputFormatters: [
  FilteringTextInputFormatter.allow(RegExp(r'^\d{1,3}\.?\d{0,1}')),
],

Przewinąłem już te, ale nie działają dla mnie:

Javascript Regex, aby zezwalać tylko na 2-cyfrowe i 3-cyfrowe liczby oddzielone przecinkami

Wyrażenie regularne JavaScript, aby dopasować maksymalnie 11 cyfr, jeden przecinek i 2 cyfry po nim

Jquery dopuszcza tylko 2 cyfry zmiennoprzecinkowe przed i po kropce

Flutter - Regex w TextFormField

Zezwolić tylko na dwie liczby dziesiętne na wejściu trzepotania?

Odpowiedzi

1 Andrej Nov 21 2020 at 21:33

Nie jestem ekspertem od regexów, więc mogę tylko zasugerować użycie tej funkcji pomocniczej:

  bool match(String input) {
    if (input.split('.').length == 1) {
      // if there is no dot in the string
      // returns true if the length is < 4
      return (input.length < 4) ? true : false;
    } else if (input.split('.').length > 1){
      // if there is more than one dot in the string
      return false;
    } else {
      // if there is a dot in the string
      // returns true if there are < 4 digits before the dot and exactly 1 digit 
      // after the dot
      return (input.split('.')[0].length < 4 && input.split('.')[1].length == 1)
          ? true
          : false;
    }
  }
2 AkshitOstwal Nov 21 2020 at 21:27
RegExp(r'^\d{0,3}(\.\d{1})?$')

spróbuj tego wyrażenia regularnego

też myślę przecinkiem o twojej średniej dziesiętnej (.) i biorąc pod uwagę, że chcesz 3 cyfry przed dziesiętną i 1 po przecinku

TextFormField(
  autoValidateMode: AutoValidateMode.always,
  validator: (value) {
    return RegExp(r'^\d{0,3}(\.\d{1})?$').hasMatch(value) ? null : 'Invalid value';
  },
)
1 BambinoUA Nov 22 2020 at 09:26

Nie ma tu miejsca na formatowanie danych wejściowych, ponieważ formatuje dane wizualnie, a żądane formaty obejmują się nawzajem. Powinieneś używać TextFormFieldi validatorwłaściwości z walidatorem @ Andrej lub użyj RegExp.

TextFormField(
  autoValidateMode: AutoValidateMode.always,
  validator: (value) {
    return RegEx(r'^\d{1,3}(\.\d)?$').hasMatch(value) ? null : 'Invalid value';
  },
)

RegExp działa tutaj .