gpt4 book ai didi

c - 使用逗号和点来表示十进制数

转载 作者:行者123 更新时间:2023-12-02 09:13:14 25 4
gpt4 key购买 nike

我遇到了一个非常具体的问题,并且在其他地方没有找到解决方案。我正在开发一个小项目,我希望通过允许用户使用逗号或点输入价格来使其更加强大。所以我做了一个小功能,可以让我做到这一点:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main () {
setlocale(LC_ALL, "Portuguese");
float val;
char str[20];

scanf("%s", str);
for (int i = 0; str[i] != '\0'; ++i)
if (str[i] == ',')
str[i] = '.';
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);
return(0);
}

如果我不是葡萄牙语,这将按预期工作。由于我们主要在十进制数字中使用逗号,因此使用 atof 函数不起作用,因为它会转换为带点的 float ,然后当我尝试 printf 时, float 它将显示 0.0,但如果删除行 setlocale(LC_ALL, "Portuguese"); 它将正常工作。有什么想法吗?

最佳答案

有两个问题:

  • 如果您遇到的小数点对于当前区域设置来说不正确,那么只有在那时才更改它。
  • 您正在使用 atof,这是一个不安全的函数,永远不应该使用 - 它没有错误处理功能。请改用 strtof

您可以使用标准函数localeconv来获取有关当前语言环境的所有有用信息。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main (void)
{
setlocale(LC_ALL, "Portuguese");
char ok_decimal_point = localeconv()->decimal_point[0];
char bad_decimal_point = (ok_decimal_point=='.') ? ',' : '.';

float val;
char str[20] = "123.456";

for (int i = 0; str[i] != '\0'; ++i)
{
if (str[i] == bad_decimal_point)
{
str[i] = ok_decimal_point;
}
}

val = strtof(str, NULL);
printf("String value = %s, Float value = %f\n", str, val);
return(0);
}

(尽管我来自另一个使用 , 的国家,但我更喜欢教育用户使用 . 形式,因为这更像是一个国际标准。世界各地两种不同的小数点标准对人类没有帮助。那些使用最少版本的人应该适应。)

关于c - 使用逗号和点来表示十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com