¿Alguien sabe cómo convertir un número como 1, 2 o 3 en su versión de texto (uno, dos, tres) en PHP? Solo necesito convertir del 1 al 99. Sé que podría escribir una gran declaración de cambio, pero sería ridículo.Conversión de un número (1, 2, 3) en una cadena (uno, dos, tres) en PHP
Respuesta
pera tiene un paquete Numbers_Words:
$numberToWord = new Numbers_Words(); echo $numberToWords->toWords(200);
+1 No sabía que existía. –
+1 Me parece perfecto. –
O simplemente: 'Numbers_Words :: toWords (200)' –
no es ideal, pero al menos mejor que un 'gran sentencia switch':
$numbermappings = array("zero", "one","two","three", "four" .... "ninetynine");
echo $numbermappings[4]; // four
Usted todavía tiene que escribir esa enorme variedad aunque ..
Útil si no necesita una gran cantidad de números. – trueinViso
function N2L($number)
{
$result = array();
$tens = floor($number/10);
$units = $number % 10;
$words = array
(
'units' => array('', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eightteen', 'Nineteen'),
'tens' => array('', '', 'Twenty', 'Thirty', 'Fourty', 'Fifty', 'Sixty', 'Seventy', 'Eigthy', 'Ninety')
);
if ($tens < 2)
{
$result[] = $words['units'][$tens * 10 + $units];
}
else
{
$result[] = $words['tens'][$tens];
if ($units > 0)
{
$result[count($result) - 1] .= '-' . $words['units'][$units];
}
}
if (empty($result[0]))
{
$result[0] = 'Zero';
}
return trim(implode(' ', $result));
}
Hay un paquete PEAR que hace esto. Lo hace mucho más alto que el número 99 y es multi-idioma, por lo que podría ser más pesado de lo que necesita, pero aún así vale la pena ver:
Aquí hay una que escribí allá por la universidad. Incluye soporte para números negativos, también. Sé que hay algunas maneras en que podría acortarse y/o limpiarse, pero bueno, funciona bien para cualquier entero!
/**
Converts an integer to its textual representation.
@param num the number to convert to a textual representation
@param depth the number of times this has been recursed
*/
function readNumber($num, $depth=0)
{
$num = (int)$num;
$retval ="";
if ($num < 0) // if it's any other negative, just flip it and call again
return "negative " + readNumber(-$num, 0);
if ($num > 99) // 100 and above
{
if ($num > 999) // 1000 and higher
$retval .= readNumber($num/1000, $depth+3);
$num %= 1000; // now we just need the last three digits
if ($num > 99) // as long as the first digit is not zero
$retval .= readNumber($num/100, 2)." hundred\n";
$retval .=readNumber($num%100, 1); // our last two digits
}
else // from 0 to 99
{
$mod = floor($num/10);
if ($mod == 0) // ones place
{
if ($num == 1) $retval.="one";
else if ($num == 2) $retval.="two";
else if ($num == 3) $retval.="three";
else if ($num == 4) $retval.="four";
else if ($num == 5) $retval.="five";
else if ($num == 6) $retval.="six";
else if ($num == 7) $retval.="seven";
else if ($num == 8) $retval.="eight";
else if ($num == 9) $retval.="nine";
}
else if ($mod == 1) // if there's a one in the ten's place
{
if ($num == 10) $retval.="ten";
else if ($num == 11) $retval.="eleven";
else if ($num == 12) $retval.="twelve";
else if ($num == 13) $retval.="thirteen";
else if ($num == 14) $retval.="fourteen";
else if ($num == 15) $retval.="fifteen";
else if ($num == 16) $retval.="sixteen";
else if ($num == 17) $retval.="seventeen";
else if ($num == 18) $retval.="eighteen";
else if ($num == 19) $retval.="nineteen";
}
else // if there's a different number in the ten's place
{
if ($mod == 2) $retval.="twenty ";
else if ($mod == 3) $retval.="thirty ";
else if ($mod == 4) $retval.="forty ";
else if ($mod == 5) $retval.="fifty ";
else if ($mod == 6) $retval.="sixty ";
else if ($mod == 7) $retval.="seventy ";
else if ($mod == 8) $retval.="eighty ";
else if ($mod == 9) $retval.="ninety ";
if (($num % 10) != 0)
{
$retval = rtrim($retval); //get rid of space at end
$retval .= "-";
}
$retval.=readNumber($num % 10, 0);
}
}
if ($num != 0)
{
if ($depth == 3)
$retval.=" thousand\n";
else if ($depth == 6)
$retval.=" million\n";
if ($depth == 9)
$retval.=" billion\n";
}
return $retval;
}
¿Por qué la nueva línea después de cientos, miles, millones y mil millones? ¿No debería ser eso un espacio? – bdsl
Esto está mal para un billón y números más grandes. – bdsl
Escribió para cualquier ** entero **. Como el valor máximo de un entero es 2147483647 para un sistema de 32 bits en php, ¡es básicamente correcto con su afirmación! Además, 64 bits para php comenzaron en 2008 de manera experimental, por lo que es lamentable su significado del valor máximo para 32 bits. – geisterfurz007
Terminé teniendo que escribir esto para una prueba de codificación durante un proceso de entrevista. Se puede ver mi código final en Github aquí: https://github.com/mangs/integers2words
Por conveniencia, aquí es la clase DemoLibrary que implementa esta funcionalidad int2str() (todos los miembros de la clase están allí sólo para apoyar la funcionalidad int2str()
):
<?php
/**
* Demo library class intended to be added to in the future
*/
class DemoLibrary {
/***** NOTE: a const cannot be an array in PHP, so making these arrays static is the next best thing *****/
/**
* @var array $_numbersUnder20 Array containing the word associated with the index's number value
*/
private static $_numbersUnder20 = [
'zero', 'one', 'two', 'three', 'four',
'five', 'six', 'seven', 'eight', 'nine',
'ten', 'eleven', 'twelve', 'thirteen', 'fourteen',
'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'
];
/**
* @var array $_tensDigits Array containing all tens digit values except 10
*/
private static $_tensDigits = [
'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'
];
/**
* @var array $_orderOfMagnitude Array containing the higher-order digit values; can also be
* thought of as the order of magnitude of the target digit
*/
private static $_orderOfMagnitude = [
// Stopped at "quintillion" because the maximum PHP int value on 64-bit Linux is
// 9,223,372,036,854,775,807 (a.k.a. 2^63 - 1 because PHP doesn't support unsigned ints)
'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion'
];
/**
* Recursively calculates the string-, word-based equivalent of the target integer
*
* @param integer $num Integer whose value will be converted to a word-based string
* @param boolean $recursive Determines if the currently-executing code is being called
* recursively; allows for non-recursive 0 to be converted to "zero"
* otherwise use an empty string
*
* @throws InvalidArgumentException if the first argument is not of type int
*
* @return string Partially- or fully-built word-based representation of the target integer
*/
private function _integerToWords($num, $recursive=false) {
// Ensure a valid integer
if(!is_int($num)) {
throw new InvalidArgumentException(
__FUNCTION__ . ' expects parameter 1 to be of type integer; actual type: ' .
gettype($num)
);
}
/***** Perform the int to string conversion based on the size of $num *****/
// Negative
if($num < 0) {
return 'negative ' . $this->_integerToWords(-1 * $num, true);
}
// 0 or no value in the lowest digits
if($num === 0) {
return $recursive ? '' : 'zero';
}
// 1-19
if($num < 20) {
return self::$_numbersUnder20[$num];
}
// 20 - 99
if($num < 100) {
$highDigitValue = intval(floor($num/10) - 2); // Value of the highest-order digit
$remainingValue = $num % 10; // Value of the remaining digits
return
self::$_tensDigits[$highDigitValue] .
'-' .
$this->_integerToWords($remainingValue, true);
}
// 100 - 999
if($num < 1000) {
$highDigitValue = intval(floor($num/100)); // Value of the highest-order digit
$remainingValue = $num % 100; // Value of the remaining digits
return
$this->_integerToWords($highDigitValue, true) .
'-hundred ' .
$this->_integerToWords($remainingValue, true);
}
// 1,000+
$quotient = $num;
$divideCount = 0;
while($quotient >= 1000) {
$quotient /= 1000;
++$divideCount;
}
$highDigitValue = intval(floor($quotient)); // Value of the highest-order digit
$remainingValue = $num - ($highDigitValue * pow(1000, $divideCount)); // Value of the remaining digits
return
$this->_integerToWords($highDigitValue, true) .
'-' .
self::$_orderOfMagnitude[$divideCount - 1] .
' ' .
$this->_integerToWords($remainingValue, true);
}
/**
* @api
*
* Calculates the string-, word-based equivalent of the target integer
*
* @param integer $num Integer whose value will be converted to a word-based string
*
* @return string Fully-built word-based representation of the target integer
*/
public function int2str($num) {
return trim($this->_integerToWords($num), "- \t\n\r\0\x0B");
}
}
- 1. Transformar [: uno, 1,: dos, 2] a {: uno => 1,: dos => 2} en Ruby
- 2. 1 + 1/2 + 1/3 + --- + 1/n =?
- 3. PHP: cómo llenar una matriz con claves y valores de modo 1 = 1, 2 = 2, 3 = 3, etc.
- 4. convertir un número entero en una cadena como 3
- 5. Agregue 2 valores a 1 clave en una matriz PHP
- 6. conversión de Excepción a una cadena en Python 3
- 7. Extrayendo un número de una cadena de 1 palabra
- 8. Suma de series: 1^1 + 2^2 + 3^3 + ... + n^n (mod m)
- 9. conversión de cadena a número en Javascript/jQuery
- 10. ¿Por qué es el número máximo en java 2^31 - 1 y no 2^31
- 11. ¿Cuál es la prueba de (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 12. Comprobar si una cadena comienza con un número en PHP
- 13. Compruebe si una cadena termina con un número en PHP
- 14. Cómo combinar estos tres métodos en uno
- 15. Conversión de un entero en una cadena hexadecimal en Ruby
- 16. ¿Por qué SELECCIONAR 2^3 devuelve 1 en SQL Server?
- 17. R: eliminación de los últimos tres puntos de una cadena
- 18. Excel vba - cadena de conversión al número
- 19. cómo hacer jQuery cada uno un número
- 20. la conversión de una cadena vacía en nil en Ruby
- 21. Buscar tres números apareció una sola vez
- 22. PHP buscando una cadena en un archivo
- 23. Separar una cadena en un número, conservando el número
- 24. genera un número aleatorio entre 1 yx donde es más probable un número menor que uno más alto
- 25. php obtener el número de una cadena
- 26. en python ¿cómo convierto un número de un solo dígito en una cadena de dos dígitos?
- 27. Conversión de tipo de JavaScript: (true && 1) vs (true | | 1)
- 28. ¿Cuál es más eficiente para una cadena de uno o dos caracteres: CHAR (2) o VARCHAR (2)?
- 29. Calcular el número de horas entre 2 fechas en PHP
- 30. Cálculo del número de años entre 2 fechas en PHP
posible duplicado de [¿Hay una manera fácil de convertir un número a una palabra en PHP?] (http://stackoverflow.com/questions/277569/is-there-an-easy-way-to-convert-a-number -to-a-word-in-php) –
respuesta satisfecha aquí [http://stackoverflow.com/questions/14314997/how-to-convert-amount-in-number-to-words](http://stackoverflow .com/questions/14314997/how-to-convert-amount-in-number-to-words) –