2009-01-12 23 views
16

Quiero formatear el número 3253454 para los visitantes de mi sitio web.PHP: formato de número de configuración regional

Si utilizo la función Number_format incorporado, me sale: 3.253.454 que es ideal para el Reino Unido y EE.UU., sin embargo la mayoría de otros países utilizar 3.253.454

tengo muchos visitantes internacionales.

¿Alguien me puede dar una indicación de las mejores prácticas aquí?

Idealmente deseo obtener la configuración regional del navegador y formatear el número en consecuencia. ¿Esto es posible en PHP?

Respuesta

6
string number_format (float $number, int $decimals, string $dec_point, string $thousands_sep) 

ver php doku for number_format

Otro enlace útil puede ser Zend_Locale de Zend Framework - que puede detectar el idioma del usuario y también ayudar con número/formato de moneda

4

De http://us3.php.net/manual/en/function.number-format.php#76448:

<?php 

    function strtonumber($str, $dec_point=null, $thousands_sep=null) 
    { 
     if(is_null($dec_point) || is_null($thousands_sep)) { 
      $locale = localeconv(); 
      if(is_null($dec_point)) { 
       $dec_point = $locale['decimal_point']; 
      } 
      if(is_null($thousands_sep)) { 
       $thousands_sep = $locale['thousands_sep']; 
      } 
     } 
     $number = (float) str_replace($dec_point, '.', str_replace($thousands_sep, '', $str)); 
     if($number == (int) $number) { 
      return (int) $number; 
     } else { 
      return $number; 
     } 
    } 

?> 

Eso parece ser exactamente lo que estás buscando. :)

0

Puede usar la variable de servidor HTTP_ACCEPT_LANGUAGE para adivinar su configuración regional y el formato de número esperado.

Si tuviera que poner en práctica esto, yo lo permitiría a un usuario establecer una preferencia para anular la adivinado, y mi función se vería así:

function number_format_locale($number,$decimals=2) { 
    $locale = (isset($_COOKIE['locale']) ? 
        $_COOKIE['locale'] : 
        $_SERVER['HTTP_ACCEPT_LANGUAGE'] 
       ) 
    switch($locale) { 
     case 'en-us': 
     case 'en-ca': 
      $decimal = '.'; 
      $thousands = ','; 
      break; 
     case 'fr': 
     case 'ca': 
     case 'de': 
     case 'en-gb': 
      $decimal = ','; 
      $thousands = ' '; 
      break; 
     case 'es': 
     case 'es-mx': 
     default: 
      $decimal = ','; 
      $thousands = ' '; 
    } 
    return $number_format($number,$decimals,$decimal,$thousands); 
} 
+1

Tenga en cuenta que no sé (ni investigado) los formatos esperados de los escenarios anteriores. – yaauie

+0

usamos $ decimal = '.' y $ miles = ',' aquí en 'soleado' blighty (en-gb) :) – Christian

14

Si va a implementar una página web localizada, va a querer asegurarse de que setlocale(). Riff fuera del post anterior de yaauie me gustaría añadir algo como el siguiente fragmento de código en el código de inicialización:

$locale = (isset($_COOKIE['locale'])) ? 
      $_COOKIE['locale'] : 
      $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
setlocale(LC_ALL, $locale); 

Luego modificamos la función number_format_locale() anteriormente, para buscar así:

function number_format_locale($number,$decimals=2) { 
    $locale = localeconv(); 
    return number_format($number,$decimals, 
       $locale['decimal_point'], 
       $locale['thousands_sep']); 
} 

De Por supuesto que se trata de un mundo ideal, dependiendo de la plataforma en la que se implemente y de la versión de los archivos de configuración regional que haya instalado, es posible que tenga que codificar algunas irregularidades. Pero establecer la configuración regional ayudará con el dinero, los números y las fechas.

+0

Genius. Funcionó como un encanto para mí. –

+0

Tenga en cuenta que setlocale() no es seguro para subprocesos. Eso significa que si está ejecutando PHP en un servidor que usa subprocesos en lugar de procesos (o planee hacerlo algún día), no use setlocale() para cambiar la configuración regional. Vea la nueva respuesta que sugiere NumberFormatter, que es ahora la forma preferida de hacerlo. – orrd

0

En mi proyecto utilizo Zend Framework. En este caso, uso tal cosa:

$locale = new Zend_Locale('fr_FR'); 
$number = Zend_Locale_Format::toNumber(2.5, array('locale' => $locale)); 

// will return 2,5 
print $number; 
6

¿Quizás intente acercarse independientemente de establecer la configuración global para todos los scripts? locale

Get del usuario:

$locale = (isset($_COOKIE['locale'])) ? 
      $_COOKIE['locale'] : 
      $_SERVER['HTTP_ACCEPT_LANGUAGE']; 

Formato del número:

recomiendo el uso de PHP NumberFormatter.Es un enfoque OOP que usa ICU library.

$formatStyle=NumberFormatter::DECIMAL; 
$formatter= new NumberFormatter($locale, $formatStyle); 
echo $formatter->format(3253454);//proper output depending on locale 

Puede utilizar diferentes formatos de estilo allí, por ejemplo: Decimal, MONEDA o porcentaje. Leer más here.

Es la mejor forma de formatear el número, porque depende de global Unicode Common Locale Data Repository.

Cuestiones relacionadas