【问题标题】:currency parsing and conversion using shell commands使用 shell 命令进行货币解析和转换
【发布时间】:2013-02-10 10:29:14
【问题描述】:

我正在寻找一种外壳单行器,它将以下示例货币字符串 PHP10000 解析为 $245。我需要从字符串中解析数字,将其与预设的转换因子相乘,然后在结果中添加“$”前缀。

到目前为止,我所拥有的只有这个:

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

结果为@​​987654322@。

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

我在想awk 也可以解决这个问题,但我是 shell 命令的初学者。

更新:

我试过了:

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

并且乘法仅适用于整数。我不能使用浮点数,因为它给了我这个错误:expr: not a decimal number: '2.1'

【问题讨论】:

  • 我拒绝任何人向我解释这与数学有什么关系。至少删除那个标签。
  • 根据目的,您可能需要比建议更多的小数位数,尽管您可能会在保留这样一个“友好”的乘数/除数时获得“幸运”。稍微改变一下,在 PHP 中运行 1000 个示例,将 PHP 值和 USD 值相加,将 PHP 总和转换为 USD 并比较两个 USD 值。如果您只是转换商店或目录或其他东西的“价格”,那么可以。如果您从事财务方面的工作,则需要做更多的工作。
  • @duffymo:我用数学标记它,因为我基本上想在 shell 上进行数学运算。
  • @BillWoodger:这一行的目的是在shell上处理文本文件,在文本中搜索货币,然后转换成目标货币。
  • 这不是数学;只是“我不知道如何用 PHP 解析”。

标签: shell sed awk


【解决方案1】:
value=PHP10000
factor=40.82
printf -v converted '$%.2f' "$(bc <<< "${value#PHP} / $factor")"
echo $converted    # => $244.98
  • ${value#PHP} 部分是 parameter expansion,它从 $value 字符串的前面删除 PHP 字符串
  • &lt;&lt;&lt; 部分是 bash here-string,因此您将公式传递给 bc 程序
  • bash 不做浮点运算,所以调用bc 进行计算
  • printf -v varname 相当于其他语言 varname = sprintf(...)

【讨论】:

  • +1 printf 的酷用。我最初也使用神奇的数字 40.8 进行计算。但是在重新阅读了几次之后,我几乎可以肯定 OP 的意思是乘以 0.0245。 HTH。
  • 好吧,除以 x 或乘以 1/x -- 结果相同。
【解决方案2】:

一种方式:

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

【讨论】:

  • Bash 不支持浮点运算 - 计算是由 awk 完成的,不知道你为什么提到 bash。
  • @MaximYegorushkin:如果不清楚,抱歉。我实际上指的是“更新”下的 OP 的 cmets。他正在尝试使用sedbash。我是说他需要使用bc 来获取十进制数如果他不想使用awk。 HTH。
  • 您可以将转换因子作为参数传递,因此不需要硬编码:convfact=0.0245; awk -F "PHP" -v factor="$convfact" '{ printf "$%d\n", $2 * factor }'
【解决方案3】:

类似:

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

【讨论】:

  • 哇,这个不错!请问substr($1,4)中的“4”是什么意思?
  • 表示从位置 4 开始,没有指定长度,表示一直到字符串的末尾。您的数据是否仅是货币金额,并且每条记录只有一个?
  • @dashmug 是一个返回子字符串的函数。见gnu.org/software/gawk/manual/gawk.html#String-Functions
【解决方案4】:

另一种选择:

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

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2012-03-13
    • 2011-03-17
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多