如何发送包含十进制浮点(。)的USSD代码?

时间:2015-07-02 23:04:43

标签: android decimal separator currency ussd

我需要发送包含double值的USSD代码,该代码表示​​要转移的余额帐户金额。该值由整数组成,也可以是小数分隔符和2个以上的数字。我的代码如下:

    double doubleValue = 0.70;
    String phoneNumber = "51234567", pincode = "1234";
    String ast = Uri.encode("*");
    String baseUssd = ast + "234" + ast + "1" + ast + phoneNumber + ast + pincode + ast;
    StringBuilder builder = new StringBuilder();
    builder.append(baseUssd);
    builder.append(doubleValue); //i.e: 1.35, 0.80
    builder.append(Uri.encode("#"));
    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + builder.toString()));
    startActivity(intent);

我的手机将doubleValue视为135,080等,忽略点分隔符。我希望最终的代码包含“dot”,允许发送十进制值。有人解决了这个问题吗?

2 个答案:

答案 0 :(得分:6)

显示的Java代码当然可以正常工作,假设doubleValue是float或double。

正如建议的here,Intent由OutgoingCallBroadcaster.processIntent()处理,它通过调用PhoneNumberUtils.convertKeypadLettersToDigits()和PhoneNumberUtils.stripSeparators()来处理Intent中给出的String。

后者除去数字之外的所有内容,*#+以及WILDWAITPAUSE符号。< / p>

这是您的小数点分隔符丢失的地方。

因此,分隔符应转义为特定的数值或由其中一个接受的符号替换,以实际离开手机并到达接收器。

负责接收端的人可能会建议您正确格式化十进制数。

答案 1 :(得分:6)

考虑到我的银行发送给我的pinpad的工作方式,你总是要在小数点后面输入两位数,并且显示屏上的格式处理点的位置。

因此,如果我输入&#34; 1&#34;,则将其解释为0.01。 同样地&#34; 1023&#34;将是10.23。

我认为同样的方法可以很好地为您服务。 因此输入1.23作为&#34; 123&#34;和0.80作为&#34; 80&#34;

我无法看到将字符限制为0-9#*的引用,但所有示例都遵循此格式。但是,您的示例启动* 234,这似乎符合规范

中的此规则

案例a)集合中的1,2或3位数字(*,#)后跟1X(Y),其中X =任意数字0-4,Y =任意数字 0-9,然后,可选&#34; *后跟任意数量的任何字符&#34;,并以#SEND结束: 此案例保留供HPLMN使用。当服务网络从a接收到这样的消息时 访问用户,它应将USSD消息直接传递给HPLMN。如果它从一个接收它 归属用户,由网络决定是在本地处理它还是将其传递给HLR

http://www.etsi.org/deliver/etsi_ts/100600_100699/100625/07.00.00_60/ts_100625v070000p.pdf

通常,我不确定HPLMN(家庭公共陆地移动网络)或HLR(归属位置寄存器)是否会期望额外的字符,即使USSD协议中允许整个字符集甚至其他字符集。