2013-02-10 69 views
0

我正在寻找一个shell,它将解析以下示例货币字符串PHP10000 into $ 245。我需要解析字符串中的数字,将其与预设的转换因子相乘,然后为结果添加“$”前缀。使用shell命令进行货币解析和转换

到目前为止,我有什么仅仅是这样的:

echo PHP10000 | sed -e 's/PHP//' 

这给10000作为结果。

现在,我被困在如何对结果进行乘法运算。

我想awk也可以给这个解决方案,但我是一个初学者在shell命令。

更新:

我想:

echo PHP10000 | expr `sed -e 's/PHP//'` \* 2 

和乘法正常工作只对整数。我不能使用浮点数,因为它给了我这个错误:expr: not a decimal number: '2.1'

+0

我无视任何人向我解释这与数学有什么关系。至少删除该标签。 – duffymo 2013-02-10 14:13:13

+0

根据目的,您可能需要比建议的更多小数位,尽管您可能会“幸运”,同时保留这样一个“友好”的被乘数/除数。稍作改动,用PHP中的1000个示例运行,将PHP值和USD值相加,将PHP总额转换为USD并比较两个USD值。如果您只是将商店或产品目录或某物的“价格”转换成商品,那就OK。如果你正在做一些经济上的事情,你需要更多的工作。 – 2013-02-10 14:47:44

+0

@duffymo:我用数学标记它,因为我基本上想在shell上进行数学运算。 – dashmug 2013-02-11 12:35:21

回答

1

单程:

echo "PHP10000" | awk -F "PHP" '{ printf "$%d\n", $2 * .0245 }' 

结果:

$245 

或者打印到小数点后两位:

echo "PHP10000" | awk -F "PHP" '{ printf "$%.2f\n", $2 * .0245 }' 

结果:

$245.00 

编辑:

Bash不支持浮点运算。使用bc代替:

echo "PHP10000" | sed 's/PHP\([0-9]\+\)/echo "scale=2; \1*.0245\/1" | bc/e' 

结果:

245.00 
+0

_Bash不支持浮点操作_ - 计算由awk完成,不知道为什么您提到bash。 – 2013-02-10 12:15:50

+0

@MaximYegorushkin:对不起,如果不明确。我实际上是指“更新”下的OP评论。他试图使用'sed'和'bash'。我说他需要使用'bc'来获得十进制数_if_他不想使用'awk'。 HTH。 – Steve 2013-02-10 12:20:21

+0

您可以将转换因子作为参数传递,因此不需要进行硬编码:'convfact = 0.0245; awk -F“PHP”-v factor =“$ convfact”'{printf'$%d \ n“,$ 2 * factor}'' – 2013-02-12 18:01:01

1

是这样的:

echo PHP10000 | awk '/PHP/ { printf "$%.0f\n", .0245 * substr($1,4) }' 

它可以很容易地扩展到多币种版本转换成一种货币(称为报价货币),例如:

awk ' 
BEGIN { 
    rates["PHPUSD"]=.01 
    rates["GBPUSD"]=1.58 
} 
/[A-Z]{3}[0-9.]+/ { 
    pair=substr($1,1,3) "USD" 
    amount=substr($1,4) 
    print "USD" amount * rates[pair] 
} 
' <<EOF 
PHP100 
GBP100 
EOF 

输出:

USD1 
USD158 
+0

哇,这是一个很好的!请问,'substr($ 1,4)'中的“4”是什么意思? – dashmug 2013-02-10 10:43:23

+0

从位置4开始,没有指定长度的意思是指直到字符串的末尾。您的数据是否只是货币数量,并且每个记录只有一个数据? – 2013-02-10 10:52:52

+0

@dashmug它是一个返回子字符串的函数。请参阅http://www.gnu.org/software/gawk/manual/gawk.html#String-函数 – 2013-02-10 12:06:40

2
value=PHP10000 
factor=40.82 
printf -v converted '$%.2f' "$(bc <<< "${value#PHP}/$factor")" 
echo $converted # => $244.98 
  • ${value#PHP}部分parameter expansion$value字符串前去除PHP字符串
  • <<<部分是bash here-string,所以你通过表单乌拉到公元前程序
  • 庆典不做浮点运算,所以叫bc进行计算
  • printf -v varname是其他语言varname = sprintf(...)
+0

+1使用'printf'很酷。我最初也使用神奇数字40.8为我的计算。但几次重读这个问题后,我几乎可以确定OP的意思是乘以0.0245。 HTH。 – Steve 2013-02-10 12:32:59

+1

好吧,除以x或乘以1/x - 相同的结果。 – 2013-02-10 12:42:36

0

相当于另一种替代方案:

$ echo "PHP10000" | awk 'sub(/PHP/,""){ print "$" $0 * .0245 }' 
$245