strval

(PHP 4, PHP 5, PHP 7, PHP 8)

strval获取变量的字符串值

描述

strval(混合 $value): 字符串

获取变量的字符串值。有关转换为字符串的更多信息,请参阅 字符串 的文档。

此函数对返回的值不执行任何格式化。如果您正在寻找一种将数值格式化为字符串的方法,请参阅 sprintf()number_format()

参数

value

要转换为 字符串 的变量。

value 可以是任何标量类型、 或实现 __toString() 方法的 对象。您不能对数组或未实现 __toString() 方法的对象使用 strval()

返回值

value字符串 值。

示例

示例 #1 使用 PHP 魔术 __toString() 方法的 strval() 示例。

<?php
class StrValTest
{
public function
__toString()
{
return
__CLASS__;
}
}

// 输出 'StrValTest'
echo strval(new StrValTest);
?>

参见

添加备注

用户贡献的备注 9 则备注

Mark Clements
8 年前
关于此函数随时间推移的变化的一些说明,涉及以下语句

> 您不能对数组或未实现
> __toString() 方法的对象使用 strval()。

== 数组 ==

在 PHP 5.3 及更低版本中,strval(array(1, 2, 3)) 将返回字符串 "Array",不会出现任何错误。

从 5.4 及更高版本开始,返回值保持不变,但您现在会收到一个通知级别的错误:"Array to string conversion"。

== 对象 ==

对于未实现 __toString() 的对象,行为有所不同

PHP 4: "Object"
PHP 5 < 5.2: "Object id #1"(数字显然会变化)
PHP >= 5.2: 可捕获的致命错误:无法将类 X 的对象转换为字符串
Hayley Watson
16 年前
从 PHP 5.2 开始,strval() 将返回对象的字符串值,调用其 __toString() 方法来确定该值是什么。
Tom Nicholson
20 年前
如果您想将整数转换为英文单词字符串,例如 29 -> twenty-nine,那么这里有一个函数可以做到。

关于使用 fmod() 的说明
我使用浮点数 fmod() 而不是 % 运算符,因为 % 将操作数转换为 int,从而破坏了 [-2147483648, 2147483647] 范围之外的值。

我没有费心处理 "billion",因为这个词表示 10e9 或 10e12,取决于你问谁。

如果参数不代表整数,则函数返回 '#'。

<?php
$nwords
= array( "零", "一", "二", "三", "四", "五", "六", "七",
"八", "九", "十", "十一", "十二", "十三",
"十四", "十五", "十六", "十七", "十八",
"十九", "二十", 30 => "三十", 40 => "四十",
50 => "五十", 60 => "六十", 70 => "七十", 80 => "八十",
90 => "九十" );

function
int_to_words($x) {
global
$nwords;

if(!
is_numeric($x))
$w = '#';
else if(
fmod($x, 1) != 0)
$w = '#';
else {
if(
$x < 0) {
$w = '负 ';
$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)] .' 百';
$r = fmod($x, 100);
if(
$r > 0)
$w .= ' 零 '. int_to_words($r);
} else if(
$x < 1000000) { // 1000 to 999999
$w .= int_to_words(floor($x/1000)) .' 千';
$r = fmod($x, 1000);
if(
$r > 0) {
$w .= ' ';
if(
$r < 100)
$w .= '零 ';
$w .= int_to_words($r);
}
} else {
// millions
$w .= int_to_words(floor($x/1000000)) .' 百万';
$r = fmod($x, 1000000);
if(
$r > 0) {
$w .= ' ';
if(
$r < 100)
$word .= '零 ';
$w .= int_to_words($r);
}
}
}
return
$w;
}

?>

用法
<?php
echo '目前有 '. int_to_words($count) . ' 个成员在线.';
?>
php at ianco dot co dot uk
18 年前
我感到惊讶的是

(字符串)"0" == (字符串)"0.00"

评估为真。对于 strval 和单引号也是如此。
=== 可以避免这种情况。

为什么这很重要?我的一家供应商,令人难以置信地,在他们的库存文件中使用 0 表示标准折扣,使用 0.00 表示没有折扣。
kendsnyder+phpnet at gmail dot com
17 年前
将大浮点数转换为字符串的唯一方法是使用 printf('%0.0f',$float); 而不是 strval($float); (php 5.1.4)。

// strval() 会丢失大约 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

// 完全转换
printf('%0.0f',pow(2,50)); // 112589906846624
echo sprintf('%0.0f',pow(2,50)); // 112589906846624
Steve Ball
18 年前
看起来一个是无符号大整数(32 位),另一个是有符号大整数(已经回绕/溢出)。

2326201276 - (-1968766020) = 4294967296.
NyctoFixer at gmail dot com
17 年前
从 PHP 5.1.4 开始(我在更高版本中没有测试过),当 strval 函数遇到对象时,它不会尝试调用 __toString 方法。这个简单的包装函数将为您处理这种情况

<?

/**
* 返回变量的字符串值
*
* 这与 strval 不同,因为它在给定对象时会调用 __toString,
* 并且该对象具有该方法
*/
function stringVal ($value)
{
// 我们使用 get_class_methods 而不是 method_exists 来确保 __toString 是一个公共方法
if (is_object($value) && in_array("__toString", get_class_methods($value)))
return strval($value->__toString());
else
return strval($value);
}

?>
portos_ze_retour at hotmail dot fr
18 年前
为了补充 Tom Nicholson 的贡献,以下是法语版本(实际上可以更改语言,但您应该检查语法;))

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.<br>';

//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.<br>';
fabrice at vignals dot com
2 年前
我的逻辑是压力。

bolean 为真或假;

<?= strval( true); ?> //输出:1

您必须使用
<?= var_export( true ) ?> //输出:true
To Top