我编写了以下函数将字符串转换为double:
$data = array();
print_r($_POST);
if($_POST){
$result=$this->User->validate($this->input->post());
//print_r($result);
if(!empty($result)){
$data=[
'id'=> $result[0]['id'],
'username'=>$result[0]['username']
];
//print_r($data);
$this->session->set_userdata($data);
redirect(base_url('dashboard/index'));
}else{
$this->session->set_flashdata('flash_data', 'Username or password is incorrect!');
redirect(base_url('login/index'));
}
}
$page='login';
if (!file_exists(APPPATH.'views/'.$page.'.php')){
show_404();
}
$this->load->view($page);
}
我想确保函数接受的参数,只包含一个double。例如:
double convert_to_double(char *str){
char *remaining_str;
double number;
number = strtod(str, &remaining_str);
/* we want to get only a double as parameter */
if ( strlen(remaining_str) > 0 ) {
return NULL; // something like this
}
return number;
}
不是好事。"Hello world 20.12312"
没问题。在第一个例子中,我想返回NULL,“false”,任何不是double的东西,所以调用"20.12312"
的函数会知道字符串有问题。
有没有优雅的方法来做到这一点?或者在这种情况下convert_to_double
不是一个好的解决方案,我需要考虑别的什么?
答案 0 :(得分:3)
一个函数只能返回一种类型。如果要同时返回结果和成功指示器,可以通过指针返回其中一个。
double somevar;
char *input;
if (!cast_to_double(input, &somevar)) {
printf("Bad input %s\n", input);
}
然后你可以像这样使用它:
MariaDB [test]> SELECT JSON_ARRAY_APPEND(JSON_ARRAY(''), '$', JSON_EXTRACT('{"test":123}', '$'))\G
*************************** 1. row ***************************
JSON_ARRAY_APPEND(JSON_ARRAY(''), '$', JSON_EXTRACT('{"test":123}', '$')): ["", {"test": 123}]
1 row in set (0.00 sec)
答案 1 :(得分:0)
如果返回值不是指针,则不能返回NULL。
解决方案1
int ok;
double value = convert_to_double(str, &ok);
if (!ok)
{
// argh! COnversion failed
}
这样打电话:
int convert_to_double(char *str, double *number){
char *remaining_str;
*number = strtod(str, &remaining_str);
/* we want to get only a double as parameter */
if ( strlen(remaining_str) > 0 ) {
return 0; // converion failed
}
return 1; // conversion OK
}
解决方案2
double value;
if (!convert_to_double(str, &value))
{
// argh! COnversion failed
}
这样打电话:
{{1}}
答案 2 :(得分:0)
您的函数返回double
,而不是NULL
void *
(((void*)0)
)。
函数仅返回固定类型的1个数据。要按照您想要的方式处理,您可以传递指针参数来检查转换过程,如下所示:
bool success = true;
double value = cast_to_double("My double : 2.3", &success);
if (success)
...
然后,您的函数可以修改bool *success
值。反过来可能会更好:
double value = 0;
if (! cast_to_double("My double 3.2", &value))
// Error
这样你可以检查返回值,并像往常一样将字符串作为双精度。