选择显示字体大小

封装mathfp和floatbox

前几天看到mathfp的文章,很有些激动,
有了浮点数很多不能做的事情都变为可能。
但是一大堆mathfp开头的函数和不断的转换让人头大。
于是就想着自己封装一下,很多人都有这个想法吧:)
我的这个叫做float。

1。首先是浮点常数,这个没什么好说的

public static final float pi=new float(mathfp.pi);
public static final float e=new float(mathfp.e);
public static final float pi2=pi.div(2);
public static final float pi4=pi.div(4);
public static final float pi=pi.div(180); //pi/180
public static final float neg1=new float(-1); //-1
public static final float pos1=new float(1); //+1
public static final float ln10=new float(10).ln_s();
public static final float zero=new float(0);

2。字段和构造函数

long v;
public float(float f)
{
v=f.v;
}
public float(string val)
{
v=mathfp.tofp(val);
}
public float(int val)
{
v=mathfp.tofp(val);
}
private float(long val)
{
v=val;
}

最后一个构造函数相当与clone的意思。

3。函数的封装(我把基本运算也归到里面了)
一开始我是这么做的,比如add函数:

public float add(float b)
{
return new float(mathfp.add(v,b.v));
}
public float add(int b)
{
return new float(mathfp.add(v,mathfp.tofp(b)));
}

大家看出什么问题来了吗?
如果要做一个x+1+2+3+4的运算,通过调用x.add(1).add(2).add(3).add(4)
将会生成4个float对象,而其中的3个float对象用过就扔掉了。
这使gc的负担飚升。于是我增加了这样一个方法:

public float add_s(float b)
{
v=mathfp.add(v,b.v);
return this;
}

相当于+=的功能,于是可以调用x.add(1).add_s(2).add_s(3).add_s(4)来实现
这样就节省了3个float的开销。其他的函数类推就不罗索了,下面看看floatbox。

既然有了浮点数,我们如何输入呢?文本框有数字模式但是不支持浮点数,
用any模式?这样太不专业了,于是就有了floatbox。

这就是整个实现:

package vmlinux.math;

import javax.microedition.lcdui.*;
import vmlinux.app.*;

public class floatbox extends canvas {

public static final string[] keypad=new string[]{
"1","2","3",
"4","5","6",
"7","8","9",
".","0","+/-"
};
public command done;
public command cancel;
public command delete;
stringbuffer val_;
boolean dot_;
image imgkeypad_;
char c_;

public floatbox(commandlistener o)
{
cancel=new command(stringmanager.get("floatbox.cancel"),command.screen,3);
done=new command(stringmanager.get("floatbox.done"),command.screen,2);
delete=new command(stringmanager.get("floatbox.delete"),command.screen,1);
this.addcommand(cancel);
this.addcommand(done);
this.addcommand(delete);
this.setcommandlistener(o);
val_=new stringbuffer("0");
dot_=false;
}

protected void paint(graphics g) {
g.setcolor(0xff,0xff,0xff);
g.fillrect(0,0,getwidth(),getheight());
g.setcolor(0x00,0x00,0x00);
g.drawrect(5,5,getwidth()-10,30);
g.setcolor(0x00,0x00,0xff);
g.drawstring(val_.tostring(),getwidth()-10,10,graphics.topgraphics.right);
drawkeypad(keypad,40,g,c_);
}

void drawkeypad(string[] keys,int ytake,graphics gx,char chr)
{
int xs=getwidth()/3;
int ys=(getheight()-ytake)/4;
int hcenter=graphics.topgraphics.hcenter;
if(imgkeypad_==null)
{
imgkeypad_=image.createimage(getwidth(),getheight()-ytake);
graphics g=imgkeypad_.getgraphics();
int c=0;
for(int j=0;j<4;++j)
&#123;
for(int i=0;i<3;++i)
&#123;
g.setcolor(0xcc,0xcc,0xcc);
g.drawrect((xs+1)*i,(ys+1)*j,xs-2,ys-2);
if(c<keys.length)
&#123;
g.setcolor(0x00,0x00,0x00);
g.drawstring(keys[c++],xs*i+xs/2-2,ys*j+ys/2-8,hcenter);
&#125;
&#125;
&#125;
&#125;
gx.drawimage(imgkeypad_,0,ytake,graphics.topgraphics.left);
for(int i=0;i<keys.length;++i)
&#123;
if(keys[i].indexof(chr)>=0)
&#123;
gx.setcolor(0xbb,0xbb,0xbb);
gx.fillrect((xs+1)*(i%3),(ys+1)*(i/3)+ytake,xs-2,ys-2);
gx.setcolor(0xff,0xff,0xff);
gx.drawstring(keys[i],xs*(i%3)+xs/2,ys*(i/3)+ytake+ys/2-5,hcenter);
break;
&#125;
&#125;
&#125;

protected void keypressed(int key)
&#123;
if(key==canvas.key_num0)
&#123;
if(val_.length()==0
(val_.length()>0 && val_.charat(0)!='0'))
val_.append('0');
c_='0';
&#125;
else if(key>=canvas.key_num1 && key<=canvas.key_num9)
&#123;
char c=(char)('1'+key-canvas.key_num1);
if(val_.length()==1 && val_.charat(0)=='0')
&#123;
val_.deletecharat(0);
val_.append(c);
&#125;
else
val_.append(c);
c_=c;
&#125;
else if(key==canvas.key_star)
&#123;
if(!dot_)
&#123;
val_.append('.');
dot_=true;
&#125;
c_='.';
&#125;
else if(key==canvas.key_pound)
&#123;
if(val_.length()>0 && val_.charat(0)=='-')
val_.deletecharat(0);
else if(val_.length()!=1 val_.charat(0)!='0')
val_.insert(0,'-');
c_='-';
&#125;
else if(this.getgameaction(key)==canvas.left)
&#123;
delete();
&#125;
repaint();
&#125;

public void delete()
&#123;
if(val_.length()>0)
&#123;
if(val_.charat(val_.length()-1)=='.')
dot_=false;
val_.deletecharat(val_.length()-1);
if(val_.length()==1 && val_.charat(0)=='-')
val_.deletecharat(0);
&#125;
if(val_.length()==0)
val_.append('0');
&#125;

public float getvalue()
&#123;
return new float(val_.tostring());
&#125;

public void setvalue(float x)
&#123;
val_.delete(0,val_.length());
val_.append(x.tostring());
&#125;
&#125;

没什么难度,不多说了。stringmanager参见我的另一篇字符串管理的文章。
样子很丑,看起来就像一个计算器。

有什么意见或建议请联系vmlinuxx@gmail.com,共同学习,共同进步:)


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons