ColdFusion too big to be an integer

2019-02-17 02:15发布

I am trying to convert a large number going in to Megabytes. I don't want decimals

numeric function formatMB(required numeric num) output="false" {
    return arguments.num \ 1024 \ 1024;
    } 

It then throws an error

enter image description here

How do I get around this?

2条回答
该账号已被封号
2楼-- · 2019-02-17 03:08

the size of a Long, which is what CF uses for integers

Small correction for those that may not read the comments. CF primarily uses 32 bit signed Integers, not Long (which has a much greater capacity). So as the error message indicates, the size limit here is the capacity of an Integer:

  • Integer.MAX_VALUE = 2147483647
  • Long.MAX_VALUE = 9223372036854775807

It is worth noting that although CF is relatively typeless, some Math and Date functions also have the same limitation. For example, although DateAdd technically supports milliseconds, if you try and use a very large number:

//  getTime() - returns number of milliseconds since January 1, 1970 
currentDate = dateAdd("l", now().getTime(), createDate(1970,1,1));

... it will fail with the exact same error because the "number" parameter must be an integer. So take note if the documentation mentions an "Integer" is expected. It does not just mean a "number" or "numeric" ...

查看更多
Evening l夕情丶
3楼-- · 2019-02-17 03:12

You can't change the size of a Long, which is what CF uses for integers. So you'll need to BigInteger instead:

numeric function formatMB(required numeric num) {
    var numberAsBigInteger = createObject("java", "java.math.BigInteger").init(javacast("string", num));
    var mbAsBytes = 1024 ^ 2;
    var mbAsBytesAsBigInteger = createObject("java", "java.math.BigInteger").init(javacast("string", mbAsBytes));
    var numberInMb = numberAsBigInteger.divide(mbAsBytesAsBigInteger);
    return numberInMb.longValue();
}

CLI.writeLn(formatMB(2147483648));

But as Leigh points out... for what you're doing, you're probably better off just doing this:

return floor(arguments.num / (1024 * 1024));
查看更多
登录 后发表回答