mkcsrc: clear OLDNITCOPT in src/Makefile
[nit.git] / examples / calculator.nit
index d1417ad..541f4d2 100644 (file)
@@ -27,7 +27,12 @@ class CalculatorContext
        fun push_op( op : Char )
        do
                apply_last_op_if_any
-               last_op = op # store for next push_op
+               if op == 'C' then
+                       self.result = 0.0
+                       last_op = null
+               else
+                       last_op = op # store for next push_op
+               end
 
                # prepare next current
                after_point = null
@@ -52,6 +57,7 @@ class CalculatorContext
 
        fun switch_to_decimals
        do
+               if self.current == null then current = 0.0
                if after_point != null then return
 
                after_point = -1
@@ -91,6 +97,7 @@ class CalculatorGui
 
        var lbl_disp : GtkLabel
        var but_eq : GtkButton
+       var but_dot : GtkButton
 
        var context = new CalculatorContext
 
@@ -106,28 +113,33 @@ class CalculatorGui
                if user_data isa Char then # is an operation
                        var c = user_data
                        if c == '.' then
+                               but_dot.sensitive= false
                                context.switch_to_decimals
                                lbl_disp.text = "{context.current.to_i}."
                        else
+                               but_dot.sensitive= true
                                context.push_op( c )
                                
                                var s = context.result.to_precision_native(6)
                                var index : nullable Int = null
                                for i in s.length.times do
-                                   var chiffre = s[i]
+                                   var chiffre = s.chars[i]
                                    if chiffre == '0' and index == null then
                                        index = i
                                    else if chiffre != '0' then
                                        index = null
                                    end
                                end
-                               if index != null then s = s.substring(0, index)
+                               if index != null then
+                                       s = s.substring(0, index)
+                                       if s.chars[s.length-1] == ',' then s = s.substring(0, s.length-1)
+                               end
                                lbl_disp.text = s
                        end
                else if user_data isa Int then # is a number
                        var n = user_data
                        context.push_digit( n )
-                       lbl_disp.text = context.current.to_precision(after_point)
+                       lbl_disp.text = context.current.to_precision_native(after_point)
                end
        end
 
@@ -170,11 +182,17 @@ class CalculatorGui
                container.attach( but_eq, 4, 3, 1, 2 )
 
                # .
-               var but_dot = new GtkButton.with_label( "." )
+               but_dot = new GtkButton.with_label( "." )
                but_dot.request_size( 64, 64 )
                but_dot.signal_connect( "clicked", self, '.' )
                container.attach( but_dot, 1, 4, 1, 1 )
 
+               #C
+               var but_c =  new GtkButton.with_label( "C" )
+               but_c.request_size( 64, 64 )
+               but_c.signal_connect("clicked", self, 'C')
+               container.attach( but_c, 2, 4, 1, 1 )
+
                win.show_all
        end
 end
@@ -220,6 +238,32 @@ context.push_op( '=' )
 r = context.result.to_precision( 2 )
 assert r == "14.10" else print r
 
+#test multiple decimals
+context = new CalculatorContext
+context.push_digit( 5 )
+context.push_digit( 0 )
+context.switch_to_decimals
+context.push_digit( 1 )
+context.push_digit( 2 )
+context.push_digit( 3 )
+context.push_op( '+' )
+context.push_digit( 1 )
+context.push_op( '=' )
+r = context.result.to_precision( 3 )
+assert r == "51.123" else print r
+
+#test 'C' button
+context = new CalculatorContext
+context.push_digit( 1 )
+context.push_digit( 0 )
+context.push_op( '+' )
+context.push_digit( 1 )
+context.push_digit( 0 )
+context.push_op( '=' )
+context.push_op( 'C' )
+r = context.result.to_precision( 1 )
+assert r == "0.0" else print r
+
 # graphical application
 
 if "NIT_TESTING".environ != "true" then