C# 中没有四舍五入函数,程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法Bankers rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的Math.Round 方法默认的也是 Banker 舍入法在 .NET 2.0 中 Math.Round 方法有几个重载方法Math.Round(Decimal, MidpointRounding)Math.Round(Double, MidpointRounding)Math.Round(Decimal, Int32, MidpointRounding)Math.Round(Double, Int32, MidpointRounding)将小数值舍入到指定精度。MidpointRounding 参数,指定当一个值正好处于另两个数中间时如何舍入那个值该参数是个 MidpointRounding 枚举此枚举有两个成员,MSDN 中的说明是:AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值。ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。注 意!这里关于 MidpointRounding.AwayFromZero 的说明是过错的!实际舍入为两个值中绝对值较大的值。不过 MSDN 中的 例子是正确的,英文描述原文是 it is rounded toward the nearest number that is away from zero.所以,要实现四舍五入函数,对于正数,可以加一个 MidpointRounding.AwayFromZero 参数指定当一个数字是其他两个数字的中间值时其舍入为两个值中绝对值较大的值,例:Math.Round(3.45, 2, MidpointRounding.AwayFromZero)不过对于负数上面的方法就又不对了因此需要自己写个函数来处理第一个函数:double Round(double value, int decimals){if (value < 0){return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero);}else{return Math.Round(value, decimals, MidpointRounding.AwayFromZero);}} 第二个函数:double Round(double d, int i){if(d >=0){d += 5 * Math.Pow(10, -(i + 1));}else{d += -5 * Math.Pow(10, […]
View Details<% if request("infoid")<>"" then set rs=conn.execute("select * from nproduct where id="&request("infoid")) if not (rs.eof and rs.bof) then proname=rs("proname") content=rs("proinfo") end if rs.close set rs=nothing end if %> 早几天在系统中添加文件管理的下载功能, 要求在ASPX文件中实现, 以进行权限的控件,于是添加下列代码: … Response.ContentType = mime; //相应的MIME TYPE Response.AppendHeader("Content-Disposition", "attachment; filename=\"" +fileName + "\""); Response.BinaryWrite(bytes); Response.End(); … 当fileName中包含中文时, 文件下载保存时, 文件名变成了乱码, 需要用户修改,这也就违被了我设定预设文件名的初衷. 解决办法1: 对fileName进行URL编码, 把下划线标注的那句改为Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + Server.UrlEncode(fileName) + "\"");便可. 虽然中文乱码问题解决了, 但是还有一个问题: 在测试时, 下载保存的文件名有时会变成该页面的名字(.aspx), 虽然可以把内容下载到本地, 但是需要更改文件名及类型, 这样会给用户带来很大的困惑. 还有一个办法, 可以很简单的解决以上的两个问题: 解决办法2: 假设当前的URL为 http://localhost/download.aspx?id=123, fileName为"下载.pdf", 我们只要把下载URL改为 http://localhost/download.aspx/下载.pdf?id=123 可, 上面下划线标注的那句代码则可以注释掉了, 试一下, 结果一定让你非常满意! 转自:http://www.webshu.net/jiaocheng/programme/ASPNET/200606/1427.html
View Details昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内容,但无法进行处理。 – WSDL 文档包含无法解析的链接。 – 下载“http://admin-pc/IISHostService/Service1.svc?xsd=xsd0”时出错。 – 基础连接已经关闭: 接收时发生错误。 – 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 – 远程主机强迫关闭了一个现有的连接。 元数据包含无法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。 元数据包含无法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。 如果该服务已在当前解决方案中定义,请尝试生成该解决方案,然后再次添加服务引用。 该错误是在使用svcutil生成client代码时报的错误,服务是部署在IIS7上,部署的过程都是完全教科书式的进行。服务也正常启动了,显示如下内容 已创建服务。 若要测试此服务,需要创建一个客户端,并将其用于调用该服务。可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作:
1 |
<strong>svcutil.exe </strong><a href="http://leo-pc/IISHostService/Service1.svc?wsdl"><strong>http://leo-pc/IISHostService/Service1.svc?wsdl</strong></a> |
按照提示直接用svcutil.exe http://admin-pc/IISHostService/Service1.svc?wsdl命令去生成代码,就出现了开头说的那个错误。而如果用visual studio的webdevserver启动,则一切正常。 经过一轮谷百之后,发现网上有很多类似的情况,有的说是因为用了wsHttpBinding协议引起的,或者是元数据没有正确公开,但都不是他们说的情况。后来找到了一篇文章,说的是添加WCF引用的一个陷阱。里面提到的情形跟我遇到的一致,原来问题出在权限,难怪用webdevserver可以很正常的运行。原来在下载http://admin-pc/IISHostService/Service1.svc?xsd=xsd0时的权限不足,在浏览器直接访问这个url会提示找不到页面。原因就是IIS进程的用户没有访问Windows\Temp目录的权限。找到Temp目录,然后找到IIS_USER用户,授权即可。 具体可参考:http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/ 转自:http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html
View Details在Asp.Net中对页面分页的方法很多,可以直接用sql语句分,也可以使用.net提供的PageDataSource类来分页,显示的视图同样可以使用第三方控件AspNetPager等来显示,下面就来重点说说这几种分页方式: 一般情况下我们都是通过sql语句来分页,这在无论哪种开发语音都是通用的, 使用sql语句或者存储过程分页的方式最主要的是要在读取数据的时候把sql语句或者存储过程写好,它的原理是只读取当前要显示的几行记录,所以要根据页数和每页显示的数目来写语句,如下: 很显然只要将pageSize和Page作为参数就可以了,然后再前台调用的时候只要指定当前页数和每页显示的数目,就可以实现分页了,为了显示总数目,还可以读取所有数目,可以通过url来传递页码,如果总记录数位count,每页显示的数目为pageSize,那么总页数就是pageCount=((count-1)/pageSize)+1,在读取的时候代码如下: int rowLine = (currentPage – 1) *pageSize; sql = "Select top pageSize * from News where id not in(select top rowLine id from News)" 然后在页面中 int pp=1; DataSet ds = TransactionsBLL.GetList(kid, pp); DataSet ds1 = TransactionsBLL.GetList(kid); int count = ds1.Tables[0].Rows.Count; int pageCount = ((count-8-1) /16) + 1; if (pp < pageCount) { lblFy.Text = "共" + count + "条 <a href='?id=" + cid + "&pager=1′>首页</a> <a href='?id=" + cid + "&pager=" + (pp – 1) + "'>上一页</a> <a href='?id=" + cid + "&pager=" + (pp + 1) + "'>下一页</a> <a href='?id=" + cid + "&pager=" + pageCount + "'>尾页</a> 当前第" + pp + "页/共" + pageCount + "页"; } else { lblFy.Text = "共" + count + "条 <a href='?id=" + cid + "&pager=1′>首页</a> <a href='?id=" + cid + "&pager=" + (pp – 1) + "'>上一页</a> <a href='?id=" + cid + "&pager=" + pageCount + "'>下一页</a> <a href='?id=" + cid + "&pager=" + pageCount + "'>尾页</a> 当前第" + pp + "页/共" + pageCount + "页"; } 随便粘贴的代码,大概就是这样子的 需要注意的时候,由于.net在回传的时候不保存当前页,所以如果使用按钮进行分页的时候需要使用ViewState来保存页数,每次只读取所需要的几条记录,所以适合做大型网站数量比较大的时候使用,一般的分页都比较简单,如果有这种情况,比如说有10条数据,要求第一页显示2条,其他的页数都显示4条,那么就我们知道就显示3页就可以了,这个要怎么实现呢,其实这个只需要我们稍微判断下就可以了 代码: View Code public DataSet GetList(int pp) { string sql = null; DataSet ds = null; if (pp == 1 || pp == 0) { //第一页的时候显示2行数据 sql = "Select top 2 * from News" } else { //第二页的时候显示除了第一页的2条数据之外的前4条数据 if (pp == 2) { sql = "Select top 4 * from News where id not in(select top 2 id from News)"; } else { //第三页和之后的页显示 (pp – 2) *4 然后在加上第一页的2条,也就是(pp – 2) *4+2条数据之外的前4条数据 int rowLine = (pp – 2) *4+2; sql = "Select top pageSize * from News where id not in(select top rowLine id from News)" } } ds = SqlHelper.ExecuteDataSet(CommandType.Text, sql); return ds; } 然后在页面里我们要获得页数 int pageCount = (((count-2-1) /4) + 1)+1; 一般的情况下pageCount=((count-1) /4) + 1 在这里我们可以先去掉第一页显示的2条数据,然后进行分页,假如是2页,那么因为还有第一页,所以这里还需要在后面再加上一页,也就是 (((count-2-1) /4) + 1)+1; 另外一种分页方式就是使用.net提供的PageDataSource类来分页, PageDataSource是微软提供一个用于分页使用的类,集成了绑定控件的一些方法,在使用的时候,我们只需要从数据库读取我们所要的数据,绑定到PageDataSource即可,然后允许PageDataSource可以分页,指定当前页和每页要显示的数目,这样就可以很好的获得的总的数目,结合控件,ViewState就可以完成自定义分页视图,方法如下: PagedDataSource pageDataSource = new PagedDataSource(); pageDataSource.DataSource = NewsManager.GetNews();//所有记录 pageDataSource.AllowPaging = true; pageDataSource.PageSize […]
View Details处理图片时常用的过程是:读入图片文件并转化为Bitmap -> 处理此Bitmap的每个点以得到需要的效果 -> 保存新的Bitmap到文件 使用C#很方便的就可以把多种格式的图片文件读到Bitmap对象中。一句话就够了,常见的格式都支持,诸如JPEG,BMP,PNG等等。 Bitmap bmp = new Bitmap("文件名"); 然后就是怎么处理这个图片的问题了,与本案无关,pass。 最后就是保存。JPEG虽然是有损压缩方案,但是它在缩减文件体积和尽可能好的保留原有信息的矛盾上很好的找到了平衡点,所以在很多情况下成为首选的保存方案。 C#当然不会无视这一点,Bitmap类提供了默认的另存为JPEG的方法: bmp.Save("输出文件", System.Drawing.Imaging.ImageFormat.Jpeg); 这样当然很方便,但有时候更在乎文件体积而有时候更在乎图像质量,是不是有什么办法可以让自己来控制压缩质量呢? 答案是肯定的,bmp.Save方法中有个重载用到了EncoderParameters参数。我们可以在这个参数中加入自己的控制质量。 /**//// <summary> /// 保存JPG时用 /// </summary> /// <param name="mimeType"></param> /// <returns>得到指定mimeType的ImageCodecInfo</returns> private static ImageCodecInfo GetCodecInfo(string mimeType) { ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders(); foreach (ImageCodecInfo ici in CodecInfo) { if (ici.MimeType == mimeType) return ici; } return null; } /**//// <summary> /// 保存为JPEG格式,支持压缩质量选项 /// </summary> /// <param name="bmp"></param> /// <param name="FileName"></param> /// <param name="Qty"></param> /// <returns></returns> public static bool KiSaveAsJPEG(Bitmap bmp, string FileName, int Qty) { try { EncoderParameter p; EncoderParameters ps; […]
View Details手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能。 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫描一下,或者搜索一下,然后下单,不找零,直接送到你家,这将是手机支付给我们带来的全新交易体验。 谷歌刚推出了谷歌钱包,这必是我们后面要使用的主要手段,但是鉴于当前国情,我觉得有必要介绍一下android手机集成支付宝功能。 1.下载官方架包和说明文档 其实官方已经提供了安装指南,下载地址: https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash https://mobiless.alipay.com/product/product_down_load.htm?code=SECURITY_PAY 里面有有个pdf,详细说明了说用指南,写的比较详细,可以重点参考。 下载下来,我们主要是用到Android(20120104)目录下的alipay_plugin.jar和AppDemo/assets下的alipay_plugin223_0309.apk,这两个文件是我们不能修改的支付宝api和安装包。 2. 商户签约 现在的安全机制,都是这样,客户端需要先和服务端请求验证后才能进行进一步操作,oauth也是如此。 打开https://ms.alipay.com/,登陆支付宝,点击签约入口,选择"应用类产品",填写并等待审核,获取商户ID和账户ID。 签约的时候还要向需要提供实名认证和上传应用,所以我建议先把应用做好了,最后再集成支付宝。 我大概等了1-2天审核,审核是失败的,回复是应用类型啥的应该是"虚拟货币",我改成那个马上自动就审核通过了。 3.密钥配置 解压openssl-0.9.8k_WIN32(RSA密钥生成工具).zip,打开cmd,命令行进入openssl-0.9.8k_WIN32(RSA密钥生成工具)\bin目录下, (1).执行 1 openssl genrsa -out rsa_private_key.pem 1024 生成rsa_private_key.pem文件。 (2).再执行 1 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成rsa_public_key.pem 文件。 (3).在执行 1 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt 将RSA私钥转换成 PKCS8 格式,去掉begin和end那两行,把里面的内容拷贝出来,保存到某个txt中,如rsa_private_pkcs8_key.txt中(我好像没用到这个)。 打开rsa_public_key.pem,即商户的公钥,复制到一个新的TXT中,删除文件头”—--BEGIN PUBLIC KEY—--“与文件尾”—--END PUBLIC KEY—--“还有空格、换行,变成一行字符串并保存该 TXT 文件,然后在网站的“我的商家服务”切换卡下的右边点击“密钥管理”,然后有个"上传商户公钥(RSA)"项,选择上传刚才的TXT文件. 好了,服务器配置OK,因为这一段之前没有截图,现在弄好了又不好截图,如果有不明白的地方请大家参考官方文档。 错误提示 failure calling remote service 原因: 私钥没转PKCS8 4.引用jar和包含安装包 (1).新建android工程; (2).copy上面说的alipay_plugin.jar到工程的libs目录下,并在java build path中通过Add External JARs找到并引用该jar; (3).copy上面说的alipay_plugin223_0309.apk安装包到assets目录下,后面配置路径用到。 如果libs和assets目录没有,手动建立者两个目录。 5.调用代码整理 这里我们要严重的参考文档中AppDemo,我们建一个包com.tianxia.lib.baseworld.alipay,把AppDemo的com.alipay.android.appDemo4包下的源码全部copy到刚才我们自己的包下,还有res目录下的资源文件也合并到我们工程res下。 其中AlixDemo.java,ProductListAdapter.java,Products.java是示例类,我们借鉴完后可以删除。 PartnerConfig.java是配置类,配置商户的一些配置参数。 其他的类是严重参考类,直接留下使用。 PartnerConfig.java代码如下: 1 2 3 4 5 6 7 […]
View Details
1 2 3 4 5 |
Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人来讲,一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单,只要把模拟器的默认DNS设置成电脑的DNS地址即可。 第一步:启动模拟器并确保adb连通 第二步:使用adb的shell,确认系统的各项属性 |
1 2 3 |
adb shell getprop |
1 2 3 4 5 |
getprop会列出系统当前的各项属性 第三步:得到模拟器的DNS地址 在结果里可以看到: |
1 2 3 4 |
[net.dns1]: [10.0.2.3] [net.dns2]: [10.0.2.4] [net.dns3]: [10.0.2.5] [net.dns4]: [10.0.2.6] |
1 |
第四步:把dns改成我们自己的DNS |
1 |
setprop net.dns1 192.168.1.1 |
1 |
<strong>注:一般TP-LINK及D-LINK的DNS都是192.168.1.1,如果不是请使用ipcnofig /all命令确认,另外,按照上面的步骤设置好后,需要在模拟器的Setting->无线网络设置里,把“启用数据流量”勾选上,让模拟器的TopTar上出现3G图标,才可上网~</strong> |
1 |
<strong> </strong> |
1 |
以上方法,在重启模拟器后设置的property会丢失,就需要重新设置一遍,可以使用下面的方法解决: |
1 2 3 |
找到你的SDK目录,里面有个system-images文件夹,这里保存着系统镜像文件,用文本编辑器打开里面的build.prop文件,在里面加上net.dns1=自己的DNS,保存;再重新创建模拟器即可~ 转自:<a href="http://www.cnblogs.com/flyme/archive/2011/11/14/2248213.html">http://www.cnblogs.com/flyme/archive/2011/11/14/2248213.html</a> |
下载Eclipse PDT All-In-One http://download.eclipse.org/tools/pdt/downloads/ 安装Zend Debugger · 选择Help->Software Updates->Find and Install · 选择 Search for new features to install, 点击 Next · 点击 the New Remote Site 按钮… Name: Zend Debugger URL: http://downloads.zend.com/pdt · Zend Debugger 现在在Sites to include in search 列表被选中, 点击 Finish按钮。 同样的方式安装JSEclipse(如果需要团队合作还可以装上Subclipse提供对Subversion 的支持) Name: JSEclipse URL: http://download.macromedia.com/pub/labs/jseclipse/autoinstall Name: Subclipse 1.2.x URL: http://subclipse.tigris.org/update_1.2.x Name: Aptana URL: http://update.aptana.com/update/3.2/ PDT调试方法 PHP Executable Debugger Zend Executable Debugger – 免费的Eclipse插件,在Eclipse 环境提供可执行的调试功能 PHP Web Server Debugger Zend Web Server Debugger – 安装在Web 服务器端的调试工具 XDebug Components – XDebug用于Web 服务器端的调试 注:版本发布类型 Released Builds – 稳定经过测试的发布版,可能不包含最新的功能特性 Stable […]
View Detailsnode.js Tools for Visual Studio 提供了在 Visual Studio 中开发 Node.js 应用的扩展。 软件首页 软件下载 转自:http://www.oschina.net/p/nodejstools
View Details