我有一个插件,用于根据自定义字段对Wordpress帖子进行排序。该字段是价格字段。该插件适用于所有使用欧元和美元的国家。我有一个来自荷兰的客户,它使用欧元但有特殊字符来定义美分。这些特殊字符在插件中引发了排序错误。
以下是按价格检索和排序的MySQL代码:
function price_sort_it() {
global $wpdb, $thisorder;
if($thisorder == 'price-lowest') {
$this_order = 'ASC';
}
else if($thisorder == 'price-highest') {
$this_order = 'DESC';
}
return "(SELECT CAST(REPLACE(REPLACE(REPLACE($wpdb->postmeta.meta_value, ',', ''), '€',''),' ','') AS SIGNED)
FROM $wpdb->postmeta
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->postmeta.meta_key = 'ad_price')" . $this_order;
}
add_filter('posts_orderby', 'price_sort_it');
此代码删除了千位逗号分隔符,并在排序之前删除了货币符号。它完美无缺。
问题是荷兰客户的广告价格如下:
与正常值一样:
其中逗号表示小数,逗号和负数表示十进制和2个零的缩写。
有关如何解决这一壮举的明智之词?
答案 0 :(得分:2)
您将客户端的数字格式描述为不是“正常”格式。这是我的第一个警钟。
没有任何“正常”或其他任何关于在任何特定位置使用点或逗号格式化数字的信息。不同的国家/地区有不同的格式约定,实际上大多数国家/地区使用逗号作为小数字符,而点数作为千位分隔符。这几乎适用于所有欧洲大陆国家。
所以不要将您喜欢的格式视为“正常”。客户端看到他们的格式正常,你很奇怪。客户就是为此付钱的人。
处理此问题的标准方法是处理程序中未格式化的所有数字,并使用PHP number_format()
function以客户端要求的格式显示它们。
例如:
$number_in_dutch_format = number_format($unformatted_number, 2, ',', '.');
您可以使用逗号并指向变量,这样您就可以在程序中对其进行配置,这样每个客户都可以拥有自己喜欢的格式。
如果您需要更复杂的格式,sprintf()
等功能也可能有用。
但是,您应该指定的一件事是,您应该坚持使用给定客户的单一格式。
您还可以在此处阅读有关此主题的其他问题,例如:PHP: Locale aware number format
希望有所帮助。