Showing posts with label 编程方案. Show all posts
Showing posts with label 编程方案. Show all posts

Tuesday, July 7, 2020

Python初体验 - 计算股票购买或出售的最终价格

自从自己不需要再写程式后、微软也宣布主推.Net不再为ASP(写网页)和VBS(写系统)做更新后,
更有一段时间Windows7和Windows10都不支援ASP和VBS,
自己的编程能力就好像武功被废了,以前所写的程式如今备份储存在硬碟内,就好像一堆占位子的垃圾。
直到最近在买新笔电后,要把旧笔电的档案转到新笔电时,自己才又重新整理起自己以前这一堆曾经的资产。
意外发现,原来如今的Windows10又支援了当年的ASP和VBS,但当然微软只是支援,已经没有再为它们更新了。
为什么说资产呢?
因为我不是出生Programmer,我毕业是多媒体Designer,我是在压力之下成为了一个程式编程员。
即便如此,但我所写的第一代系统成就了我的公司,今日的系统也是参照了往日我的系统雏形而编写出来的。
如今公司迈入了13个年头,今日的这一堆卸任退休了的程式备份,曾是我最重要的、公司最重要的资产,也是我自己的骄傲。
有时看着这一堆备份程式系统档案,想着它们曾经的辉煌,曾经忙碌到处理指令都来不及,一直发生延误。
如今的系统已经是第三代了,是同事们用JAVA写的新一代系统,新系统能处理的指令更多,更快速、更强大,
看着这一堆出A到Z自我手、卸任了的第一代运作程式,我感触良多。

意外的,今天在网络上阅读到关于Python的资料,老实说恕我孤陋寡闻,Python这一词我还是今天才知道。
大约看了一下它的模式和句法,第一次接触Python,感觉Python很像我的老剪刀VBS。
Python似乎更强大、而且编写方面反而更为简单容易。

今天我现学现做,牛刀小试马上用Python写下了一套用来计算股票购买或出售后的最终价格的小程式。
水钱当然就会是我自己所用的Broker水钱(可任意选择CIMB的Direct账户0.35%或是Maybank的Nominess账户0.1%)。
我心情感觉非常的愉悦。

我喜欢数学,即便我毕业于设计,但当初做编程时,我也喜欢编程,
因为道理就是我非常享受我Solve到难题的成就感,比如Solve到的复杂数学题,或用程式Solve到复杂的方案。

以下分享我Python初体验-可用来计算股票购买或出售的最终价格,
有CIMB Direct Acc的水钱和Maybank Nominees Acc的水钱计算供选择。


Action = input("a: Buy Shares b: Sell Shares (a/b)?")
if Action != "a" and Action != "b":
 print("Please key in again")
 Action = input("a: Buy Shares b: Sell Shares (a/b)?")
else:
 pass

Unit = float(input("Enter Unit :"))
Price = float(input("Enter Price :"))
Gross = round(Unit * Price, 2)
print("-------------------------")
print("Gross Price =", Gross)
print("-------------------------")
print(" ")
print("Choose the Brokerage Rate (a/b) :")
print("a : CIMB Direct(0.35%)")
print("b : MBB Nominees(0.1%)")
Broker = str(input("Broker : "))

if Broker == "a":
 BrokerN = "CIMB Direct Account"
 BrokerA = Gross * 0.0035
 if BrokerA < 12:
  BrokerA = 12
 else:
  pass
elif Broker == "b":
 BrokerN = "Maybank Nominees Account"
 BrokerA = Gross * 0.001
 if BrokerA < 8:
  BrokerA = 8
 else:
  pass
elif Broker != "a" and Broker != "b":
 print("Please key in again")
 Broker = str(input("Broker : "))
 BrokerN = ""


WStamp =input("With Stamping Fees (Y/N) ?")
if WStamp == "Y" or WStamp == "y":
 StampF = int((Gross / 1000) + 1)
else:
 StampF = 0

BrokerT = round(BrokerA * 1.06, 2)
ClearF = round((Gross * 0.0003) + 0.01, 2)
FeeT = round(BrokerT + StampF + ClearF, 2)
print(" ")
print(" ")
print("Broker :", BrokerN)
print("Brokerage Total = RM", BrokerT)
print("Stamping Fees = RM", StampF)
print("Clearing Fees = RM", ClearF)
print("-------------------------")
print("Total Fees = RM", FeeT)
print("-------------------------")
if Action == "a":
 AmtT = Gross + FeeT
elif Action == "b":
 AmtT = Gross - FeeT

print("Total Amount = RM", AmtT)
print("-------------------------")
input()



Output:


也看:
-【Python 的誕生故事】覺得其他程式語言不好用,超狂荷蘭工程師花三個月打造自己的程式語言
-Python,史上最伟大的发明 !



= Copyright by Joseph Ohlian =

Monday, August 6, 2007

ASP Escape Mode

Function EscapeCode(p_Message)
Dim m_char,m_asc,m_hex
Dim m_temp
Dim a_arc()
Dim i
ReDim a_arc(Len(p_Message))
For i = 0 To Len(p_Message) -1
m_char = Mid(p_Message,i+1,1)
m_asc = AscW(m_char)
If m_asc < 255 Then
If (m_char = "*") Or(m_char = "+") _
Or(m_char >= "-" And m_char <= "9" ) _
Or(m_char >= "@" And m_char <= "Z" ) _
Or(m_char = "_") _
Or(m_char >= "a" And m_char <= "z" ) Then
a_arc(i) = m_char
Else
m_temp = Hex(m_asc)
If Len(m_temp) = 1 Then
a_arc(i) = "%0" & m_temp
ElseIf Len(m_temp) = 2 Then
a_arc(i) = "%" & m_temp
Else
a_arc(i) = "%u" & m_temp
End If
End If
Else
m_temp = Hex(m_asc)
If Len(m_temp) = 1 Then
a_arc(i) = "%u000" & m_temp
ElseIf Len(m_temp) = 2 Then
a_arc(i) = "%u00" & m_temp
ElseIf Len(m_temp) = 3 Then
a_arc(i) = "%u0" & m_temp
Else
a_arc(i) = "%u" & m_temp
End If
End If
Next
EscapeCode = Join(a_arc,"")
End Function

UCS-2 to Gb code

Function ReadC(HWord,TStartC)

for X= 0 TO (((Len(Trim(HWord))-TStartC)/4)-1)
ASplit = Mid(Replace(Right(HWord, Len(Trim(HWord))-TStartC), " ", ""),(4*X+1),4)

IF ASplit > "0000" and ASplit < "00FF" THEN
CText = Chr(CLng("&H" & ASplit))
ELSE
CText = Unescape("%u" & ASplit)
END IF

FText = FText & CText
Next

ReadC = Left(HWord, TStartC) & FText

End Function

String to UCS-2 Convert

Function Convert(Word)
For i = 1 to Len(Word)
IF Asc(Mid(Word,i,1)) > 0 and Asc(Mid(Word,i,1)) < 256 THEN
CVT = "00" & Hex(Asc(Mid(Word,i,1))) 'Convert AlphaNumeric
ELSE
CVT = Replace(Escape(Mid(Word,i,1)),"%u", "") 'Convert Chinese Character
END IF

TMsg = TMsg & CVT
Next
Convert = TMsg
END Function

Friday, July 20, 2007

Web Learning

sit on my office table, face to my laptop, i getting sleepy and sleepy.
but today very siok, because o~~ i found some asp .net learning site, and long time ago i do wish to enhance my web language to asp .net, but because of lack of time to practise and without any teaching method, so cannot learn. but this now ok.

http://ajax.asp.net/docs/default.aspx
http://cht.gotdotnet.com/quickstart/aspplus/
http://www.kiwi.com.cn
http://www.voidland.com
http://elearning.stut.edu.tw/information/aspnet/asp.net1/index_1.htm
http://stevenharman.net/blog/archive/2007/07/06/use-the-pagerequestmanager-to-get-more-control-of-your-updatepanels.aspx

Ajax please goto
http://www.w3schools.com/ajax/default.asp

Thursday, July 19, 2007

Advance Printing Code

1、控制"纵打"、 横打”和“页面的边距

(1)

<object id="factory" style="display:none" viewastext classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"

codebase="http://www.meadroid.com/scriptx/ScriptX.cab#Version=5,60,0,360"></object>

<script defer>

function SetPrintSettings() {

// -- advanced features

factory.printing.SetMarginMeasure(2) // measure margins in inches

factory.SetPageRange(false, 1, 3) // need pages from 1 to 3

factory.printing.printer = "HP DeskJet 870C"

factory.printing.copies = 2

factory.printing.collate = true

factory.printing.paperSize = "A4"

factory.printing.paperSource = "Manual feed"

// -- basic features

factory.printing.header = "This is MeadCo"

factory.printing.footer = "Advanced Printing by ScriptX"

factory.printing.portrait = false

factory.printing.leftMargin = 1.0

factory.printing.topMargin = 1.0

factory.printing.rightMargin = 1.0

factory.printing.bottomMargin = 1.0

}

</script>


(2)

<script language="javascript">

function printsetup(){

// 打印页面设置

wb.execwb(8,1);

}

function printpreview(){

// 打印页面预览


wb.execwb(7,1);


}


function printit()
{

if (confirm('确定打印吗?')) {

wb.execwb(6,6)

}

}

</script>

</head>

<body>

<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"


height=0 id=wb name=wb width=0></OBJECT>

<input type=button name=button_print value="打印" onclick="javascriptrintit()">

<input type=button name=button_setup value="打印页面设置" onclick="javascriptrintsetup();">

<input type=button name=button_show value="打印预览" onclick="javascriptrintpreview();">

<input type=button name=button_fh value="关闭" onclick="javascript:window.close();">


------------------------------------------------

关于这个组件还有其他的用法,列举如下:

WebBrowser.ExecWB(1,1) 打开

Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口

Web.ExecWB(4,1) 保存网页

Web.ExecWB(6,1) 打印

Web.ExecWB(7,1) 打印预览

Web.ExecWB(8,1) 打印页面设置

Web.ExecWB(10,1) 查看页面属性

Web.ExecWB(15,1) 好像是撤销,有待确认

Web.ExecWB(17,1) 全选

Web.ExecWB(22,1) 刷新

Web.ExecWB(45,1) 关闭窗体无提示


2、分页打印

<HTML>
<HEAD>
<STYLE>

P {page-break-after: always}

</STYLE>
</HEAD>
<BODY>

<%while not rs.eof%>

<P><%=rs(0)%></P>

<%rs.movenext%>

<%wend%>

</BODY>
</HTML>


3、ASP页面打印时如何去掉页面底部的路径和顶端的页码编号

(1)ie的文件-〉页面设置-〉讲里面的页眉和页脚里面的东西都去掉,打印就不出来了。

(2)<HTML>
<HEAD>
<TITLE> New Document </TITLE>

<META NAME="Generator" CONTENT="EditPlus">

<META NAME="Author" CONTENT="YC">

<script language="VBScript">

dim hkey_root,hkey_path,hkey_key

hkey_root="HKEY_CURRENT_USER"

hkey_path="\Software\Microsoft\Internet Explorer\PageSetup"

'//设置网页打印的页眉页脚为空

function pagesetup_null()

on error resume next

Set RegWsh = CreateObject("WScript.Shell")

hkey_key="\header"

RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""

hkey_key="\footer"

RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""

end function

'//设置网页打印的页眉页脚为默认值

function pagesetup_default()

on error resume next

Set RegWsh = CreateObject("WScript.Shell")

hkey_key="\header"

RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&P"

hkey_key="\footer"

RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&u&b&d"

end function

</script>
</HEAD>


<BODY>
<br/><p align=center>

<input type="button" value="清空页码" onclick=pagesetup_null()> <input type="button" value="恢复页吗" onclick=pagesetup_default()><br/>


</p>

</BODY>
</HTML>

4、浮动帧打印

<SCRIPT LANGUAGE=javascript>

function button1_onclick() {

var odoc=window.iframe1.document;

var r=odoc.body.createTextRange();

var stxt=r.htmlText;

alert(stxt)

var pwin=window.open("","print");

pwin.document.write(stxt);

pwin.document.close();

pwin.print();

}

</SCRIPT>

5、用FileSystem组件实现WEB应用中的本地特定打印

<script Language=VBScript>

function print_onclick //打印函数

dim label

label=document.printinfo.label.value //获得HTML页面的数据

set objfs=CreateObject("Scripting.FileSystemObject") //创建FileSystem组件对象的实例

set objprinter=objfs.CreateTextFile ("LPT1:",true) //建立与打印机的连接

objprinter.Writeline("__________________________________") //输出打印的内容

objprinter.Writeline("| |")

objprinter.Writeline("| 您打印的数据是:"&label& " |”)

objprinter.Writeline("| |")

objprinter.Writeline("|_________________________________|")

objprinter.close //断开与打印机的连接

set objprinter=nothing

set objfs=nothing // 关闭FileSystem组件对象

end function

</script>

服务器端脚本:

<%………

set conn=server.CreateObject ("adodb.connection")

conn.Open "DSN=name;UID=XXXX;PWD=XXXX;"

set rs=server.CreateObject("adodb.recordset")

rs.Open(“select ……”),conn,1,1

……….%> //与数据库进行交互

HTML页面编码:

<HTML>

<FORM ID=printinfo NAME="printinfo" >

<INPUT type="button" value="打印>>" id=print name=print > //调用打印函数

<INPUT type=hidden id=text1 name=label value=<%=………%>> //保存服务器端传来的数据

</HTML>




这个是调用WORD,进行打印

在<head></head>之间加入如下代码;

<OBJECT Classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WB width=0></OBJECT>

<script language=javascript>

function doPrintSetup(){

WB.ExecWB(8,1)

}

function doPrintPreview(){

WB.ExecWB(7,1)

}

</script>


在<body>中调用:

<input type=button name=button1 value="打印设置" onclick="return doPrintSetup()">

<input type=button name=button2 value="打印预览" onclick="return doPrintPreview()">

<input type=button name=button3 value="打印本页" onclick="javascriptrint()">


6、设置不想打印的部分

<style>

@media print{

.xx {display:none}

}

</style>

<table width="600" class="xx" border="0" cellspacing="0" cellpadding="0">

<tr>

<td height="60" align="center">不想打印的表格</td>

</tr>

</table>

7、利用word在客户端打印web页面


以前在asp中也碰到过实现在浏览器中打印的问题,特别是用局域网中的一些应用,以前的实现定义一个打印开始的标记,和一个结束的标记,然后调用window.print()方法,还有涉及在使用frame时候的打印问题,在msdn的文档中有关于这些的比较详细的介绍,但是,控制起来都比较的麻烦,而且对与打印比较精确的控制都比较难以实现,有很多的朋友也碰到过这个问题,最近读了一片文章,关于在web中的打印的实现(csdn),稍作修改,贴了出来,供大家参考一下,希望对大家有所帮助。

可以调用客户端的word进行打印前提是客户端必须安装word.

方法如下:

<%

Response.ContentType = "application/msword"

response.AddHeader "content-disposition", "inline; filename=report.doc"

%>

当把,一样的内容添加到,asp的上面时候,会在客户端自动调用word打开当前的文档,不过不要忘记把,response.buffer的属性设定为false。


8、在WEB环境下打印报表的crystal的解决方案的实例


<%@ LANGUAGE="VBSCRIPT" %>

<%

' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

' 从ADO Recordset直接生成报表

' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

'

' 概念:

'

' 这个应用被设计成演示怎样从ADO Recordset生成报表。我们首先建立ADO Connection和

' Recordset对象,然后用SQL语句从数据库中生成一个记录集。然后我们建立一个Crystal

' Reports对象,并把这个这个对象指向ADO recordset。最后我们将Crystal Reports

' Smart Viewer送到客户端显示这个报表。


' 第一步:建立ADO Connection and Recordset


' 一个ADO的数据库连接就是通过你已经存在的ODBC数据源(DSN)从象ASP这样的应用中来访问

' 数据的连接。为了达到这个例子的目的,我们将使用到用一个叫做"Xtreme Sample Data"的

' 连到Access数据库Xtreme.mdb系统DSN


' 建立ADO数据库连接:

Set oConn = Server.CreateObject("ADODB.Connection")

'这里建立叫做"oConn"的ADO connection,我们将用这个ADO connection对象连接到上述的DSN


'用 ADO connection 必须先要打开它:


oConn.Open("Xtreme Sample Database")

'这里打开我们的ODBC的数据源,这个数据源指向Access数据库Xtreme.mdb


'现在我们必须建立一个RecordSet对象:


set session("oRs") = Server.CreateObject("ADODB.Recordset")


'在上面我们建立了一个session("oRs"). 这个session中存放一个RecordSet对象

'将要包含用SQL语句返回的数据


'定义和生成 recordset:


session("oRs").ActiveConnection = oConn

'定义这个recordset将要使用的Connection 对象


session("oRs").Open "SELECT [Product ID], [Product Name] FROM Product"


'用SQL语句从Xtreme.mdb库的"Product"表中取出两个字段


'===================================================================================

'建立Crystal Reports 对象

'===================================================================================

'你可能注意到,Crystal Reports对象被设为session,这是因为已经需求就会被一个叫做

'"rptserver.asp"的ASP处理,为了让rptserver.asp能非常容易地访问Crystal Report对象,

'我们把这些对象都设为session。这样任何ASP页都运行在这个session中,都能够直接访问这些对象


reportname = "ADORecordset.rpt"


'这里建立一个字符串变量,指向Crystal Report文件(.rpt file),再用这段代码的时候

'换成你的Crystal Report文件名。


'建立APPLICATION 对象

If Not IsObject (session("oApp")) Then

Set session("oApp") = Server.CreateObject("CrystalRuntime.Application")

End If


'这个"if/end if" 结构用来每个session只建立一次 Crystal Reports Application对象o

'建立application对象 - session("oApp"),将Crystal Report Design Component

'automation server (craxdrt.dll)载入内存。

'

'我们建立session变量是为了再asp session过程中都使用它们.这样可以减少将craxdrt.dll

'载入和卸载的系统开销。在一个session中一旦建立了一个application对象我们就可以不必

'重建对象运行更多的报表 。


' 建立REPORT 对象

'

'这个REPORT 对象被Application的OpenReport方法建立


Path = Request.ServerVariables("PATH_TRANSLATED")

While (Right(Path, 1) <> "\" And Len(Path) <> 0)

iLen = Len(Path) - 1

Path = Left(Path, iLen)

Wend

response.Write path

'这个"While/Wend" 循环被用来将当前文件从虚拟路径(eg: http://Domain/Dir)转换成Crystal

' Report file的物理路径(eg: C:\)


'打开REPORT (先清除以前的任何对象)


If IsObject(session("oRpt")) then

Set session("oRpt") = nothing

End if


On error resume next


Set session("oRpt") = session("oApp").OpenReport(path & reportname, 1)

'这里用"PATH" 和 "reportname"变量计算出Crystal Report file的物理路径, 并打开它。


If Err.Number <> 0 Then

Response.Write "Error Occurred creating Report Object: " & Err.Description

Set Session("oRpt") = nothing

Set Session("oApp") = nothing

Session.Abandon

Response.End

End If


'这个 On erro resume next 块检查在建立report对象时出现的任何错误,我们正明确的捕获任何

'错误如果视图超过许可协议规定的最大并发用户数。


'注意,我们并不只建立一次report对象。这是因为有了ASP session 你可以处理更多的超过一个报表

' rptserver.asp将仅仅处理一个叫session("oRpt")的report对象。因此,你如果希望处理多个报表

'的话,就要建立一个新的session("oRpt")对象。


session("oRpt").MorePrintEngineErrorMessages = False

session("oRpt").EnableParameterPrompting = False


'这里不允许错误报告机制,包括Crystal Report Design Component automation server (craxdrt.dll)

'内建的错误报告,这是因为两个原因:

'1. 打印引擎是在Web Server上执行的, 所以任何错误信息都将被显示在服务端,如果在服务端报告出错了,

' 打印引擎将停止运作,你的应用将被“挂起”

'2. rptserver.asp 已经有一些错误处理逻辑在里面了,可以捕获任何非致命错误,并显示在客户端。

'

'**重要** 即使我们禁止了服务端引擎的错误处理,但是致命错误还是会在Web Server服务端被捕获,并

'显示出错误提示对话框。所以我们建议,你在"World Wide Web Publishing" service (IIS service)设置

'"Allow Service to Interact with Desktop"选项。这样如果你的ASP应用死了,你将能看到错误提示。


'现在我们必须告诉report在ADO recordset中的数据


'report建立在动态的ADO recordset的基础,我们必须基于我们建立的recordset来建立report

'然后在运行时我们告诉report数据在ADO Record set中。report通常依靠数据库结构文件

'(ADORecordset.ttx)建立,这个.ttx文件包含recordset的结构,不包含实际数据。


'一个Crystal Report完全依赖将要使用的Report的数据结构,因此在运行时你的数据库结构文件(ttx file)

'或真实反应ADO recordset包含的数据的DSN是十分重要的


session("oRpt").DiscardSavedData

set Database = session("oRpt").Database

'实例化report用到的数据库


set Tables = Database.Tables

'实例化数据库对象中的表


set Table1 = Tables.Item(1)

'实例化第一张表,在这个实例中这个表对象指向ADORecordset.ttx文件


Table1.SetPrivateData 3, session("oRs")


'"SetPrivateData"告诉report现在数据源是 recordset,现在report将要显示的数据包含在session("oRs")中

'如果你的report中包含子报表将提供不同的recordset来指向子报表的数据

'

'====================================================================================

'重新得到记录和建立"Page on Demand" Engine Object

'====================================================================================


On Error Resume Next

session("oRpt").ReadRecords


If Err.Number <> 0 Then

Response.Write "Error Occurred Reading Records: " & Err.Description

Set Session("oRpt") = nothing

Set Session("oApp") = nothing

Session.Abandon

Response.End

Else

If IsObject(session("oPageEngine")) Then

set session("oPageEngine") = nothing

End If

set session("oPageEngine") = session("oRpt").PageEngine

End If


' 实例化 CRYSTAL REPORTS SMART VIEWER

'

'在ASP环境中使用Crystal Reports automation server, 我们用相同的页来通过Crystal Web Report Server调用

'"Smart Viewers"

'有四个 Crystal Reports Smart Viewers:

'

'1. ActiveX Smart Viewer

'2. Java Smart Viewer

'3. HTML Frame Smart Viewer

'4. HTML Page Smart Viewer

'

'你使用的Smart Viewer将与你数用的浏览器兼容的,例如你将不会使用Java viewer如果你的浏览器

'不支持Java applets。为此,在这个DEMO中,我们已经选择定义一个viewer,你可以通过代码决定

'提出要求的浏览器的支持兼容性,无论如何,这个功能继承自Crystal Reports automation server,

'超过了这个示例的范围。


'基于简单的理由,我们已经选择通过ASP服务端包含的功能来实现这个功能,你可以选择不同的

'SmartViewer*.asp文件送到不同的浏览器,简单的用你想用的Smart Viewer asp文件来代替。


'这些选择是: SmartViewerActiveX.asp, SmartViewerJave.asp,SmartViewerHTMLFrame.asp,

'and SmartViewerHTMLPAge.asp.注意,使用这些包含文件时,你必须把相应的.ASP文件放在同主

'ASP文件相同的虚拟路径中。

'

'*注意* 对于 SmartViewerHTMLFrame and SmartViewerHTMLPage,你必须在虚拟路径中有framepage.asp

'文件和toolbar.asp 文件


viewer = Request.Form("Viewer")


'上面读取被使用的viewer的值,并放入变量"viewer"中


If cstr(viewer) = "ActiveX" then

%>
<!-- #include file="SmartViewerActiveX.asp" -->
<%

ElseIf cstr(viewer) = "Netscape Plug-in" then

%>
<!-- #include file="ActiveXPluginViewer.asp" -->
<%

ElseIf cstr(viewer) = "Java using Browser JVM" then

%>
<!-- #include file="SmartViewerJava.asp" -->
<%

ElseIf cstr(viewer) = "Java using Java Plug-in" then

%>
<!-- #include file="JavaPluginViewer.asp" -->
<%

ElseIf cstr(viewer) = "HTML Frame" then

Response.Redirect("htmstart.asp")

Else

Response.Redirect("rptserver.asp")

End If

'上面 If/Then/Else 被设计测试"viewer" 变量的值,基于这个值,送适当的Crystal Smart Viewer

%>

常用正则表达式

正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正则表达式:\n[\s ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1><(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)(\s*$)

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

String.prototype.trim = function()
{
return this.replace(/(^\s*)(\s*$)/g, "");
}

利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi

我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s="http://www.9499.Net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

正则表达式,相关链接
http://blog.csdn.Net/laily/category/19548.Aspx
http://blog.csdn.Net/laily/archive/2004/06/30/30525.Aspx 微软的正则表达式教程(五):选择/编组和后向引用

http://blog.csdn.Net/laily/archive/2004/06/30/30522.Aspx 微软的正则表达式教程(四):限定符和定位符

http://blog.csdn.Net/laily/archive/2004/06/30/30517.Aspx 微软的正则表达式教程(三):字符匹配

http://blog.csdn.Net/laily/archive/2004/06/30/30514.Aspx 微软的正则表达式教程(二):正则表达式语法和优先权顺序

http://blog.csdn.Net/laily/archive/2004/06/30/30511.Aspx 微软的正则表达式教程(一):正则表达式简介

http://blog.csdn.Net/laily/archive/2004/06/30/30360.Aspx 小程序大作为:高级查找/替换、正则表达式练习器、Javascript脚本程序调试器

http://blog.csdn.Net/laily/archive/2004/06/24/25872.Aspx 经典正则表达式

正则表达式,正规表达式,正则表达式匹配,正则表达式语法,模式匹配,正规表达式匹配 javascript正则表达式 Asp正则表达式 Asp.Net正则表达式 C#正则表达式 JSP正则表达式 Php正则表达式 VB.Net正则表达式 VBSCript正则表达式编程 delphi正则表达式 jscript

正则表达式 regular expression
正则表达式 RegExp
模式 pattern
匹配 Match
.Net命名空间: System.Text.RegularExpression

补充:
^\d+$  //匹配非负整数(正整数 + 0)
^[0-9]*[1-9][0-9]*$  //匹配正整数
^((-\d+)(0+))$  //匹配非正整数(负整数 + 0)
^-[0-9]*[1-9][0-9]*$  //匹配负整数
^-?\d+$    //匹配整数
^\d+(\.\d+)?$  //匹配非负浮点数(正浮点数 + 0)
^(([0-9]+\.[0-9]*[1-9][0-9]*)([0-9]*[1-9][0-9]*\.[0-9]+)([0-9]*[1-9][0-9]*))$  //匹配正浮点数
^((-\d+(\.\d+)?)(0+(\.0+)?))$  //匹配非正浮点数(负浮点数 + 0)
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)([0-9]*[1-9][0-9]*\.[0-9]+)([0-9]*[1-9][0-9]*)))$  //匹配负浮点数
^(-?\d+)(\.\d+)?$  //匹配浮点数
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$    //匹配email地址
^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$  //匹配url

利用正则表达式去除字串中重复的字符的算法程序:

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi
===============================
如果var s = "abacabefggeeii"
结果就不对了,结果为:abeicfgg
正则表达式的能力有限

1.确认有效电子邮件格式
下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在应用程序将地址存储在数据库中或显示在 Asp.Net 页中之前,筛选出包含无效字符的电子邮件地址。

[Visual Basic]
Function IsValidEmail(strIn As String) As Boolean
' Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)(([\w-]+\.)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$")
End Function
[C#]
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)(([\w-]+\.)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$");
}

2.清理输入字符串
下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。

[Visual Basic]
Function CleanInput(strIn As String) As String
' Replace invalid characters with empty strings.
Return Regex.Replace(strIn, "[^\w\.@-]", "")
End Function
[C#]
String CleanInput(string strIn)
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @"[^\w\.@-]", "");
}

3.更改日期格式
以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。

[Visual Basic]
Function MDYToDMY(input As String) As String
Return Regex.Replace(input, _
"\b(?\d{1,2})/(?\d{1,2})/(?\d{2,4})\b", _
"${day}-${month}-${year}")
End Function
[C#]
String MDYToDMY(String input)
{
return Regex.Replace(input,
"\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b",
"${day}-${month}-${year}");
}
Regex 替换模式
本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${day} 插入由 (?...) 组捕获的子字符串。

有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便

4.提取 URL 信息
以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如,“http://www.contoso.com:8080/letters/readme.html”将返回“http:8080”。

[Visual Basic]
Function Extension(url As String) As String
Dim r As New Regex("^(?\w+)://[^/]+?(?:\d+)?/", _
RegexOptions.Compiled)
Return r.Match(url).Result("${proto}${port}")
End Function
[C#]
String Extension(String url)
{
Regex r = new Regex(@"^(?\w+)://[^/]+?(?:\d+)?/",
RegexOptions.Compiled);
return r.Match(url).Result("${proto}${port}");
}

如何用正则表达式表示要么是数字要么是字母 是字母的话只能是一个字母 数字则无所谓?
^[a-zA-Z]$^\d+$
You are visitor:

---------------------------------------------

---------------------------------------------

007 (1) 1957 (1) 2016 (1) 2018 (4) 916变天 (1) 921 (1) 9R65 (1) ADA (4) AEONCR (17) AFFIN (5) AGM (1) Airasia (1) ALAQAR (4) Alor Setar (1) Ambank (1) ANA (1) AP (2) ASB (2) ASP (3) Assunta (2) Astrazeneca (1) ASTRO (1) bb58 (1) BEA (1) Belive (1) Bersih (2) Bigpay (2) Binance (1) BIPORT (4) BIT (1) bitcoin (2) Block (1) BNB (2) Boustead (8) Breguet (1) Breitling (3) Brickheadz (1) BrogaHill (1) BTC (7) Bucherer (1) Buenos Aires (1) Bukit Bintang (1) BURSA (37) Byakudan-nuri (1) Cardano (2) Carl F. Bucherer (3) Cartier (3) CashLite (1) Casio (2) CEX (1) Cheonggyecheon (1) CIMB (74) CIMBT (1) cityplusfm (1) ck2998 (4) Clubmed (1) Company Act (1) covid19 (17) Credor (3) CRO (1) Cruise (3) CTOS (6) cyrptocurrency (2) Damai Laut (1) Dannok (1) DAX (1) DBS (8) DCI (1) DEX (1) Disneyland (1) DOT (1) DPulze (1) DRP (1) DSLR (7) eGIA (2) EKOVEST (12) ELC (1) ETF (3) ETH (6) ethereum (4) eToro (1) Europcar (1) Filippo Loreti (3) Forbes (2) Forex (2) Fortuner (2) Frederick Constant (1) GADANG (13) Gaysorn Village (1) GCLP999 (1) Genting (3) Ginzanso (1) GKENT (1) GMT (1) GMWB5000D (1) GOLDETF (5) GOOGL (1) Grand Seiko (18) GS (1) GShock (1) GST (2) GutterUncensored (1) GyongBukGong (1) H1N1 (1) HAPSENG (1) Hatyai (4) Hibiscs (14) HKEX (1) HSBC (1) ICBC (2) Insadong (1) IPO (1) Isetan (3) James Bond (1) JAVA (1) JR (4) JTrust (1) KAREX (32) KAWAN (4) KAWANFOOD (4) KBANK (1) Kemi (2) Kenanga (1) Kickstarter (1) KIPREIT (58) KLCCP (1) KLIA Ekspress (1) KPJ (1) KWSP (3) L&G (12) Laurel (1) LCTITAN (16) Lego (3) lhdn (1) LITRAK (11) Lotte (2) LTC (1) LUNA (1) LUNO (2) MACC (1) MALAKOF (6) Mastercard (1) Maxis (5) Maybank (82) MBPJ (1) MBSB (1) MCO (8) Mechanical (2) Merchantrade (1) META (2) MFCB (10) MISC (1) Miyota (1) MMCCORP (14) Mont Kiara (2) Mont Residences (3) Mortgage (1) MSM (1) MYEG (4) mystartr (1) Namsan Tower (1) Narita (1) Nato (1) navitimer. 1959 (1) NCB (5) NEAR (2) Nestle (13) NFT (1) Nirvana (1) OCBC (1) Omega (10) OPCOM (8) P&O (1) Panerai (1) Patek Philippes (1) Pattaya (1) PAYPAL (7) PBBank (39) PCR (1) Perth (5) Phuket (1) Plintas (4) Polkadot (2) PortDickson (1) POS (1) Poslaju (1) Presage (2) Prince Court (3) Propertise (1) PRS (1) PRU15 (1) Pulau Redang (2) python (2) Quartz (2) Ranua (1) REIT (15) REVENUE (11) RHB (1) Richard Mille (1) Ripple (1) Rolex (7) RPGT (1) RSV (1) RTK (1) S9+ (1) Saito (1) Samsung (1) Santos (1) SAW (1) SBGA211 (1) SBGA391 (2) sbgc231 (1) sbge245 (1) SBGH255 (1) sbgh269 (1) sbgm235 (4) SBGN003 (2) SBGP015 (1) sbgr311 (1) sbgw255 (1) SCB (6) Seamaster (1) Seiko (14) SET (2) SGX (4) SHL (28) SIRI (3) snowflake (1) SOL (1) Solana (2) Solidity (1) speedmaster (9) Spring Drive (2) SSPN (1) SST (1) Star Cruise (3) Stareit (2) STARHILLREIT (1) Submariner (1) SUNCITY (3) SUNCON (1) SUNREIT (2) Sunway (40) SUPERMX (1) SWAB (1) Swiss Garden (1) TENAGA (24) Thongsia (1) Time (1) TM (1) TOPGLOV (7) Tudor (5) TUNEPRO (2) Uber (1) Ueno (3) Unit Trust (1) UOAREIT (5) Urushi (1) VBS (2) VISA (2) wifibaby (1) Withholding Tax (1) Xiaomi (1) XRP (2) youtuber (2) YTL (3) YTLPower (30) Zika (1) 上海 (1) 上野 (1) 东亚银行 (2) 东京 (11) 东堤小筑 (2) 东照宫 (1) 中东 (5) 中国 (31) 中社花市 (1) 丹麦 (6) 乐天 (2) 京都 (1) 仁寺洞 (1) 以太坊 (3) 以太币 (1) 伦敦 (1) 你的答案 (1) 俄罗斯 (1) 保险 (3) 信用卡 (1) 借贷 (1) 假期 (122) 光头党 (1) 克罗地亚 (1) 公司运作 (66) 公积金 (1) 公链 (1) 冠蓝狮 (5) 冬季 (14) 函馆 (2) 加密货币 (11) 匈牙利 (2) 北京 (11) 北欧 (26) 北海道 (23) 区块链 (1) 十月合唱团 (1) 千叶火锅 (1) 华为 (1) 卑尔根 (2) 卡罗维发利 (1) 印尼 (4) 原油 (1) 反贪会 (1) 另类音乐人 (1) 台中 (2) 台北 (2) 台场 (1) 台湾 (6) 合艾 (5) 吧生 (1) 哥本哈根 (6) 器官捐献 (1) 国阵 (1) 土耳其 (1) 圣彼得堡 (1) 圣诞 (1) 圣诞老人村 (3) 城隍庙 (1) 基金 (2) 塔林 (1) 外汇 (1) 大仓山 (1) 大选 (8) 大阪 (1) 大马交易所 (1) 天津 (1) 奥地利 (4) 奥斯陆 (3) 奥运会 (2) 婚宴 (4) 孩子 (1) 安华 (1) 家协 (1) 富士 (5) 富爸爸穷爸爸 (4) 寮国 (1) 对冲 (1) 小樽 (2) 崇文 (8) 工商银行 (3) 布拉格 (2) 布拉迪斯拉发 (1) 布达佩斯 (2) 希盟 (1) 建筑 (1) 微软 (1) 德国 (1) 意大利 (1) 慈善活动 (2) 慕尼黑 (1) 成都 (4) 房地产 (6) 房贷 (1) 手表 (29) 投资分享 (221) 拉斯维加斯 (1) 拉曼 (1) 拉萨 (4) 拔牙 (1) 挪威 (6) 捷克 (3) 搬家 (3) 政坛评论 (13) 教总 (1) 教育 (1) 数字营销 (1) 斯德哥尔摩 (2) 斯洛伐克 (1) 斯洛文尼亚 (1) 新书介绍 (1) 新交所 (1) 新冠肺炎 (18) 新加坡 (5) 新宿 (3) 新干线 (1) 新西兰 (1) 日光 (3) 日喀则 (4) 日本 (48) 普吉岛 (3) 景福宫 (1) 曼谷 (7) 有感而发 (83) 札幌 (13) 机械 (3) 杭州 (1) 柬埔寨 (2) 校友会 (4) 桃园 (1) 森吉山 (1) 槟城 (3) 欧债危机 (5) 欧洲 (33) 歌曲 (12) 武汉肺炎 (2) 母亲 (2) 比尔森 (1) 比特币 (5) 汇率 (1) 河口湖 (2) 法庭 (1) 波黑 (1) 泰国 (20) 泰国股市 (5) 洛杉矶 (1) 浅草 (1) 海信 (1) 消费 (3) 涉谷 (1) 清溪川 (1) 温泉 (5) 港交所 (1) 港口 (3) 游山玩水 (149) 澳洲 (5) 烧炭 (1) 爱后余生 (1) 爱沙尼亚 (1) 父亲 (2) 独中 (1) 猪仔 (1) 琅玡台 (1) 瑞典 (3) 瑞士 (2) 瑞峰菇场 (1) 瑞波币 (2) 生活小品 (109) 登别 (3) 白银 (1) 百万组合 (1) 神桥 (1) 离婚 (2) 秋田 (3) 种族主义 (2) 税务 (1) 精工 (2) 纽西兰 (1) 统考 (1) 维也纳 (3) 编程方案 (7) 网盟 (1) 网赌 (1) 罗瓦涅米 (8) 美元 (1) 美国 (6) 美国债务 (1) 胜兴车站 (1) 胡志明市 (1) 脚车 (1) 腾讯 (2) 自助游 (119) 自驾游 (6) 艾达币 (1) 芬兰 (16) 苗栗 (1) 范蠡 (1) 茉莉花革命 (1) 莫斯哥 (1) 莱特币 (1) 董总 (1) 虚拟货币 (1) 西宁 (2) 西班牙大流感 (1) 西藏 (9) 西门町 (2) 角馆 (3) 谢霆锋 (1) 警察 (1) 谷歌 (1) 财政预算案 (2) 货币 (2) 贵朵 (1) 资本奇迹 (1) 资源分享 (64) 赌球 (1) 赫尔辛基 (7) 越南 (2) 转校 (1) 运动会 (1) 迪士尼 (1) 迪拜 (5) 退休 (1) 退税 (1) 通城 (1) 钟贵发 (2) 银山 (2) 银山庄 (1) 银座 (2) 银行 (25) 锦里 (1) 长和 (3) 长实 (5) 长洲 (3) 阿冗 (1) 阿拉伯 (5) 阿斯利康 (1) 阿根廷 (1) 阿联酋 (5) 阿里健康 (1) 阿里巴巴 (1) 雅加达 (3) 霖記甕缸雞创始店 (1) 青岛 (1) 韩国 (7) 首尔 (6) 首尔塔 (1) 香港 (11) 马哈迪 (1) 马来西亚 (7) 马来西亚半岛 (3) 骨痛热症 (1) 骨骼疏松症 (1) 高雄 (1) 鬼怒川 (3) 鹿港 (1) 黄金 (6) 黑社会 (1)