|
strval
Get string value of a variable
(PHP 4, PHP 5)
Related Examples ( Source code ) » strval Examples ( Source code ) » Type conversion Approach 1 Code Examples / Notes » strvalredbeard
You can also use the PEAR package Numbers_Words, which handles many other languages.
kendsnyder+phpnet
The only way to convert a large float to a string is to use printf('%0.0f',$float); instead of strval($float); (php 5.1.4). // strval() will lose digits around pow(2,45); echo pow(2,50); // 1.1258999068426E+015 echo (string)pow(2,50); // 1.1258999068426E+015 echo strval(pow(2,50)); // 1.1258999068426E+015 // full conversion printf('%0.0f',pow(2,50)); // 112589906846624 echo sprintf('%0.0f',pow(2,50)); // 112589906846624 steve ball
It seems that one is being treated as an unsigned large int (32 bit), and the other as a signed large int (which has rolled over/under). 2326201276 - (-1968766020) = 4294967296. portos_ze_retour
In complement to Tom Nicholson's contribution, here is the french version (actually it's possible to change the language, but you should check the syntax ;) ) function int_to_words($x) { global $nwords; if(!is_numeric($x)) $w = '#'; else if(fmod($x, 1) != 0) $w = '#'; else { if($x < 0) { $w = $nwords['minus'].' '; $x = -$x; } else $w = ''; // ... now $x is a non-negative integer. if($x < 21) // 0 to 20 $w .= $nwords[$x]; else if($x < 100) { // 21 to 99 $w .= $nwords[10 * floor($x/10)]; $r = fmod($x, 10); if($r > 0) $w .= '-'. $nwords[$r]; } else if($x < 1000) { // 100 to 999 $w .= $nwords[floor($x/100)] .' '.$nwords['hundred']; $r = fmod($x, 100); if($r > 0) $w .= ' '.$nwords['separator'].' '. int_to_words($r); } else if($x < 1000000) { // 1000 to 999999 $w .= int_to_words(floor($x/1000)) .' '.$nwords['thousand']; $r = fmod($x, 1000); if($r > 0) { $w .= ' '; if($r < 100) $w .= $nwords['separator'].' '; $w .= int_to_words($r); } } else { // millions $w .= int_to_words(floor($x/1000000)) .' '.$nwords['million']; $r = fmod($x, 1000000); if($r > 0) { $w .= ' '; if($r < 100) $word .= $nwords['separator'].' '; $w .= int_to_words($r); } } } return $w; } // Usage in English $nwords = array( "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", 30 => "thirty", 40 => "forty", 50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty", 90 => "ninety" , "hundred" => "hundred", "thousand"=> "thousand", "million"=>"million", "separator"=>"and", "minus"=>"minus"); echo 'There are currently '. int_to_words(-120223456) . ' members logged on. '; //Utilisation en Francais $nwords = array( "zéro", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf", "vingt", 30 => "trente", 40 => "quarante", 50 => "cinquante", 60 => "soixante", 70 => "soixante-dix", 80 => "quatre-vingt", 90 => "quatre-vingt-dix" , "hundred" => "cent", "thousand"=> "mille", "million"=>"million", "separator"=>"", "minus"=>"moins"); echo 'Il y a actuellement '. int_to_words(-120223456) . ' membres connectés. '; tom nicholson
If you want to convert an integer into an English word string, eg. 29 -> twenty-nine, then here's a function to do it. Note on use of fmod() I used the floating point fmod() in preference to the % operator, because % converts the operands to int, corrupting values outside of the range [-2147483648, 2147483647] I haven't bothered with "billion" because the word means 10e9 or 10e12 depending who you ask. The function returns '#' if the argument does not represent a whole number. <?php $nwords = array( "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", 30 => "thirty", 40 => "forty", 50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty", 90 => "ninety" ); function int_to_words($x) { global $nwords; if(!is_numeric($x)) $w = '#'; else if(fmod($x, 1) != 0) $w = '#'; else { if($x < 0) { $w = 'minus '; $x = -$x; } else $w = ''; // ... now $x is a non-negative integer. if($x < 21) // 0 to 20 $w .= $nwords[$x]; else if($x < 100) { // 21 to 99 $w .= $nwords[10 * floor($x/10)]; $r = fmod($x, 10); if($r > 0) $w .= '-'. $nwords[$r]; } else if($x < 1000) { // 100 to 999 $w .= $nwords[floor($x/100)] .' hundred'; $r = fmod($x, 100); if($r > 0) $w .= ' and '. int_to_words($r); } else if($x < 1000000) { // 1000 to 999999 $w .= int_to_words(floor($x/1000)) .' thousand'; $r = fmod($x, 1000); if($r > 0) { $w .= ' '; if($r < 100) $w .= 'and '; $w .= int_to_words($r); } } else { // millions $w .= int_to_words(floor($x/1000000)) .' million'; $r = fmod($x, 1000000); if($r > 0) { $w .= ' '; if($r < 100) $word .= 'and '; $w .= int_to_words($r); } } } return $w; } ?> Usage: <?php echo 'There are currently '. int_to_words($count) . ' members logged on.'; ?> anthony dot parsons
If you have to compare object variables like this be careful not to make a typo, or you could end up calling __set() - <?php /* Does what you'd expect it to */ if ( $user->password == $user2->password ) /* Doesn't */ if ( $user->password = $user2->password ) ?> To avoid that ever happening, do it like this: <?php if ( strval($user->password) == $user2->password ) ?> php
I can't help being surprised that (string)"0" == (string)"0.00" evaluates to true. It's the same with strval and single quotes. === avoids it. Why does it matter? One of my suppliers, unbelievably, uses 0 to mean standard discount and 0.00 to mean no discount in their stock files. brettsg
How come this code in version 4.4 does something different than in version 4.3? $val = 538759009 ^ 0xAABBCCDD; print "val=" . $val; = 2326201276 (version 4.4) and = -1968766020 (version 4.3) hayley watson
As of PHP 5.2, strval() will return the string value of an object, calling its __toString() method to determine what that value is.
nyctofixer
As of PHP 5.1.4 (I have not tested it in later versions), the strval function does not attempt to invoke the __toString method when it encounters an object. This simple wrapper function will handle this circumstance for you: <? /** * Returns the string value of a variable * * This differs from strval in that it invokes __toString if an object is given * and the object has that method */ function stringVal ($value) { // We use get_class_methods instead of method_exists to ensure that __toString is a public method if (is_object($value) && in_array("__toString", get_class_methods($value))) return strval($value->__toString()); else return strval($value); } ?> |
Change Languagedebug_zval_dump doubleval empty floatval get_defined_vars get_resource_type gettype import_request_variables intval is_array is_binary is_bool is_buffer is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string is_unicode isset print_r serialize settype strval unserialize unset var_dump var_export |