validation - Is Zend_Validate_Int broken for integers 0-9 in in some locales? -


i'm asking question because can't believe popular validator broken in way. yet cannot understand how behavior shown following program can considered expected behavior. zf 1.12. don't know of way report bug against zf1, , zend_locale being removed in zf2, doubt there's interest in zf team. i've looked @ zend source code. , can't see how happen. here have ideas? in particular case encountered problem, value should auto-increment value db, digits validator works well. here program demonstrating problem:

<?php // put library on include_path set_include_path(implode(path_separator, array(     realpath('./library'),     get_include_path() )));  require 'zend/locale/format.php'; require 'zend/validate/int.php';  global $mutating_locales;  echo "\n*** showing function checkit() what's expected  value has locale-specific formatting\n"; checkit('1000', 'en_us'); checkit('1000', 'hi_in'); echo var_export($mutating_locales, true) . "\n\n";  echo "\n*** showing problem small integers in locale hi_in\n"; ($i = 0; $i < 101; ++$i) {     checkit((string)$i, 'hi_in'); }  echo "\n*** checking every supported locale value '1'\n"; $mutating_locales = array(); foreach (zend_locale::getlocalelist() $locale => $ignore) {     checkit('1', $locale); } echo var_export($mutating_locales, true) . "\n";  // function print if $value valid int in locale $locale function checkit($value, $locale) {     global $mutating_locales;     $formatted = zend_locale_format::tointeger(                      $value, array('locale' => $locale));     if ($formatted !== $value) {         printf("representation changed locale %s, old: '%s', new: '%s'\n",                                              $locale,   $value, $formatted);         $mutating_locales[] = $locale;     }     $validator = new zend_validate_int($locale);     $valid = $validator->isvalid($value);     if (! $valid) {         printf("value '%s' not valid int in locale '%s'\n",                    $value,                          $locale);         $invalid_locales[] = $locale;         if ($formatted === $value) {             printf("        , formatted value identical\n");         } else {             $fmtvalid = $validator->isvalid($formatted);             if (fmtvalid) {         printf("        formatted value valid\n");         } else {                 printf("        , formatted value invalid\n");             }         }     } }  $ php validate-int-bug.php  *** showing function checkit() what's expected  value has locale-specific formatting representation changed locale en_us, old: '1000', new: '1,000' representation changed locale hi_in, old: '1000', new: '1,000' array (   0 => 'en_us',   1 => 'hi_in', )   *** showing problem small integers in locale hi_in value '0' not valid int in locale 'hi_in'         , formatted value identical value '1' not valid int in locale 'hi_in'         , formatted value identical value '2' not valid int in locale 'hi_in'         , formatted value identical value '3' not valid int in locale 'hi_in'         , formatted value identical value '4' not valid int in locale 'hi_in'         , formatted value identical value '5' not valid int in locale 'hi_in'         , formatted value identical value '6' not valid int in locale 'hi_in'         , formatted value identical value '7' not valid int in locale 'hi_in'         , formatted value identical value '8' not valid int in locale 'hi_in'         , formatted value identical value '9' not valid int in locale 'hi_in'         , formatted value identical  *** checking every supported locale value '1' value '1' not valid int in locale 'ar_qa'         , formatted value identical value '1' not valid int in locale 'ar_sa'         , formatted value identical value '1' not valid int in locale 'ar_sy'         , formatted value identical value '1' not valid int in locale 'ar_tn'         , formatted value identical value '1' not valid int in locale 'ar_ye'         , formatted value identical value '1' not valid int in locale 'as_in'         , formatted value identical value '1' not valid int in locale 'as'         , formatted value identical value '1' not valid int in locale 'bn_bd'         , formatted value identical value '1' not valid int in locale 'bn_in'         , formatted value identical value '1' not valid int in locale 'bn'         , formatted value identical value '1' not valid int in locale 'dv_mv'         , formatted value identical value '1' not valid int in locale 'dv'         , formatted value identical value '1' not valid int in locale 'dz_bt'         , formatted value identical value '1' not valid int in locale 'dz'         , formatted value identical value '1' not valid int in locale 'en_in'         , formatted value identical value '1' not valid int in locale 'en_pk'         , formatted value identical value '1' not valid int in locale 'gu_in'         , formatted value identical value '1' not valid int in locale 'gu'         , formatted value identical value '1' not valid int in locale 'hi_in'         , formatted value identical value '1' not valid int in locale 'hi'         , formatted value identical value '1' not valid int in locale 'hy_am'         , formatted value identical value '1' not valid int in locale 'hy'         , formatted value identical value '1' not valid int in locale 'kn_in'         , formatted value identical value '1' not valid int in locale 'kn'         , formatted value identical value '1' not valid int in locale 'kok_in'         , formatted value identical value '1' not valid int in locale 'kok'         , formatted value identical value '1' not valid int in locale 'ml_in'         , formatted value identical value '1' not valid int in locale 'ml'         , formatted value identical value '1' not valid int in locale 'mr_in'         , formatted value identical value '1' not valid int in locale 'mr'         , formatted value identical value '1' not valid int in locale 'or_in'         , formatted value identical value '1' not valid int in locale 'or'         , formatted value identical value '1' not valid int in locale 'pa_in'         , formatted value identical value '1' not valid int in locale 'pa_pk'         , formatted value identical value '1' not valid int in locale 'pa'         , formatted value identical value '1' not valid int in locale 'sa_in'         , formatted value identical value '1' not valid int in locale 'sa'         , formatted value identical value '1' not valid int in locale 'bn'         , formatted value identical value '1' not valid int in locale 'dv_mv'         , formatted value identical value '1' not valid int in locale 'dv'         , formatted value identical value '1' not valid int in locale 'dz_bt'         , formatted value identical value '1' not valid int in locale 'dz'         , formatted value identical value '1' not valid int in locale 'en_in'         , formatted value identical value '1' not valid int in locale 'en_pk'         , formatted value identical value '1' not valid int in locale 'gu_in'         , formatted value identical value '1' not valid int in locale 'gu'         , formatted value identical value '1' not valid int in locale 'hi_in'         , formatted value identical value '1' not valid int in locale 'hi'         , formatted value identical value '1' not valid int in locale 'hy_am'         , formatted value identical value '1' not valid int in locale 'hy'         , formatted value identical value '1' not valid int in locale 'kn_in'         , formatted value identical value '1' not valid int in locale 'kn'         , formatted value identical value '1' not valid int in locale 'kok_in'         , formatted value identical value '1' not valid int in locale 'kok'         , formatted value identical value '1' not valid int in locale 'ml_in'         , formatted value identical value '1' not valid int in locale 'ml'         , formatted value identical value '1' not valid int in locale 'mr_in'         , formatted value identical value '1' not valid int in locale 'mr'         , formatted value identical value '1' not valid int in locale 'or_in'         , formatted value identical value '1' not valid int in locale 'or'         , formatted value identical value '1' not valid int in locale 'pa_in'         , formatted value identical value '1' not valid int in locale 'pa_pk'         , formatted value identical value '1' not valid int in locale 'pa'         , formatted value identical value '1' not valid int in locale 'sa_in'         , formatted value identical value '1' not valid int in locale 'sa'         , formatted value identical 

edit: found out how post zf1 issue, posted @ https://github.com/zendframework/zf1/issues/166 , refers post.

there question (zend_validate_float locale not working hi_in locale) has been asked , related yours.
put response , think might interest you.
:)
in summary, proposing add '0 'before number (replace '1' '01') or modify zend/local/format.php file (the details in answer).


Comments