printf-as3
printf-as3 copied to clipboard
Rounding
Commit: b74c6a1effcbd3ef8de35479d70b10696d99c80a
when some one does:
printf("%.2f", 0.0000000007)
It becomes: 0.1 ??
Hi,
I was experimenting with number roundings...
Maybe you guys could look at: http://code.google.com/p/bigdecimal/ and http://stackoverflow.com/questions/632802/how-to-deal-with-number-precision-in-actionscript
I think bigdecimal could be a solution?
Here a very fast sloppy example:
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import flash.events.Event;
import spark.components.HSlider;
import spark.components.TextInput;
[Bindable]
private var minimumRawValue:Number = 0;
[Bindable]
private var maximumRawValue:Number = 0.00000000007;
private function applicationEventListener( event:Event ):void
{
rawNumberSlider.addEventListener(Event.CHANGE, rawNumberSliderEventListener, false, 0, true );
minimumInput.addEventListener(Event.CHANGE, minmaxInputEventListener, false, 0, true );
maximumInput.addEventListener(Event.CHANGE, minmaxInputEventListener, false, 0, true );
minimumInput.text = minimumRawValue.toString();
maximumInput.text = maximumRawValue.toString();
}
private function setPrecision(number:Number, precision:int):Number
{
precision = Math.pow(10, precision);
return (Math.round(number * precision)/precision);
}
private function toFixed( number:Number, factor:Number ):Number
{
return (Math.round(number * factor)/factor);
}
private function rawNumberSliderEventListener( event:Event ):void
{
var rawSlider:Number = (event.target as HSlider).value;
rawNumer.text = rawSlider.toString();
var decimals:uint = uint(decimalsInput.text);
// Test 1:
formatted1.text = printf( "%."+decimals+"f", rawSlider );
//Test 2:
var factor:uint = Math.pow( 10, decimals );
formatted2.text = toFixed( rawSlider, factor ).toString();
// Test 3:
var bdValue:BigDecimal = new BigDecimal( rawSlider );
bdValue = bdValue.setScale( decimals, MathContext.ROUND_HALF_UP );
formatted3.text = bdValue.toString();
}
private function minmaxInputEventListener( event:Event ):void
{
switch ( (event.currentTarget as TextInput).id )
{
case "minimumInput":
minimumRawValue = Number((event.currentTarget as TextInput).text);
break;
case "maximumInput":
maximumRawValue = Number((event.currentTarget as TextInput).text);
break;
default:
trace( "Whoops" );
}
}
]]>
</fx:Script>
<s:Panel width="100%" height="100%">
<s:VGroup height="100%" width="100%">
<s:Form height="100%" width="100%">
<s:FormHeading label="Simulator"/>
<s:FormItem label="Minimum">
<s:TextInput id="minimumInput" />
</s:FormItem>
<s:FormItem label="Maximum">
<s:TextInput id="maximumInput" />
</s:FormItem>
<s:FormItem label="Decimals">
<s:TextInput id="decimalsInput" text="2" />
</s:FormItem>
<s:FormItem>
<s:HSlider id="rawNumberSlider"
snapInterval="{maximumRawValue/1000}"
stepSize="{maximumRawValue/100}"
minimum="{minimumRawValue}"
maximum="{maximumRawValue}"
percentWidth="100" />
</s:FormItem>
<s:FormItem label="Raw Output">
<s:TextInput toolTip="rawSlider.toString()" id="rawNumer" />
</s:FormItem>
<mx:HRule width="100%" height="1"/>
<s:Label text="formated:" />
<s:FormItem label="printf :-(">
<s:TextInput id="formatted1" />
</s:FormItem>
<s:FormItem label="custom to fixed :-)">
<s:TextInput id="formatted2" />
</s:FormItem>
<s:FormItem label="BigDecimal :-D">
<s:TextInput id="formatted3" />
</s:FormItem>
</s:Form>
</s:VGroup>
</s:Panel>
/s:Application