为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

【2017年整理】北京外贸原单尾货

2017-09-26 24页 doc 211KB 58阅读

用户头像

is_792768

暂无简介

举报
【2017年整理】北京外贸原单尾货【2017年整理】北京外贸原单尾货 北京服装进货之道 默认分类 2010-10-23 21:48:51 阅读8 评论0 字号:大中小 订阅 北京10大批发市场 2,25元”,是大多数尾货市场的宣传语。俗话说,牛皮不是吹的,火车不是推的,“2,25元”当然也不是忽悠人的。进了尾货市场一瞧,不少商品都在30元以下,个别大名牌的原单也在100元左右。反正如果你识货,你就觉得值。 你一定会问,怎么才算是“识货”,别着急,慢慢看,记者借着“讨便宜”的同时,还学了个“火眼金睛”。 天兰天尾货市场 ?码头一:天兰天尾货市场 ...
【2017年整理】北京外贸原单尾货
【2017年整理】北京外贸原单尾货 北京服装进货之道 默认分类 2010-10-23 21:48:51 阅读8 评论0 字号:大中小 订阅 北京10大批发市场 2,25元”,是大多数尾货市场的宣传语。俗话说,牛皮不是吹的,火车不是推的,“2,25元”当然也不是忽悠人的。进了尾货市场一瞧,不少商品都在30元以下,个别大名牌的原单也在100元左右。反正如果你识货,你就觉得值。 你一定会问,怎么才算是“识货”,别着急,慢慢看,记者借着“讨便宜”的同时,还学了个“火眼金睛”。 天兰天尾货市场 ?码头一:天兰天尾货市场 综合评价:人气最旺,60%商品都在80元以下,货品最多,周末要“人挤人” 营业时间:9:00-17:00 咨询电话:63401387 淘宝大坠落汇报: 作为北京第一家尾货市场,“天兰天”很好的保存着它“大哥大”般的气势。那就是以绝对的人气压倒一切。 一进“天兰天”,眼前就是一片混乱。一位商户在售卖鞋子,看上去不错的户外运动鞋只卖30元,里三层外三层的人都在试鞋,大有“过了这村就没这店”的感觉。 除了人气,这里最能比拼的就是价格。记者在商场发现,服装价格很多都是以个位起价的,8元的毛衣,10块钱的牛仔裤,30元一件的棉服一点都不稀奇。市场工作人员告诉记者,这里60%的商品都在80元以下,“100元,是顾客对尾货市场接受的心理界标,如果太贵了,那还不如去商场买算了。” 记者在一个摊位上看到一件依恋的大衣,摊主说是厂家直接拿过来的,记者质疑如何鉴别是原单,摊主略带气愤地说:“既然是卖尾货,就不会给你假的,这些都是跟厂家直接拿的,不是说卖上千元的才叫正品。如果你给我其他依恋的型号,我也可以给你去厂家拿便宜货。” 确实,在尾货市场里卖货的商家多多少少都跟厂家有些交道,部分商户还可以向依恋这位摊主一样随时拿货,但是因为有些几乎跟商场同步出售,所以价钱要稍贵一些。 格外提醒的是,别小瞧这里的商户,8平米的摊位一年有的盈利三五百万跟玩儿似的。 交通指南: ◎坐323、349、395、719等公交车在丽泽桥下车,就在丽泽桥东北角、丽泽桥长途汽车站旁边。最好 不要开车,门口特别不好停车,而且丽泽桥下经常堵车,赶上下班高峰,半个小时都出不去。 天通尾货市场 ?码头二:天通尾货市场 综合评价:原单较多,“秀水”新发地。 营业时间:10:00-18:00 咨询电话:64114847 淘宝大坠落汇报: 天通苑尾货市场在“我爱打折55bbs论坛”上很火,总有人时不时地贴出自己的周末扫货。当记者看到一位网友在一双帆布鞋的图片说明上写着 “25元拿下,动物园最低55哟”之后,义无反顾把尾货第一站贡献给了“天通苑”。 交通很方便,就在地铁5号线天通苑站旁边。地方并没有想象得大,一共只有2层,很多品牌都是过季、断码的,或者稍微有一些瑕疵,品牌还算比较多,阿迪达斯、ONLY、苹果、哥伦比亚、THE NORTH FACE,欧时力/ochirly”都有涉及。如果是原单货,店主一般都有标注,即便是残次的地方,他们也有注明,看上去心里踏实。 不知道是不是因为天冷,记者去的那天人不多,可以仔细的挑选。比起动物园,这里的衣服裤子大多都让试穿,即使最后不要,也不会招惹商家“一通臭骂”,买卖自由,比较舒服。 牛仔裤大多在25,35元之间,衬衫15元一件,外贸鞋30元左右。记者在一楼的某一商铺发现了一件不错的Royalcy日单外贸羽绒服,只卖20元。记者询问老板为什么卖这么便宜,答复是:“没办法,今年积压的货太多,往年这时候都开始上春装了,今年冬装还压着收不了,能卖一件是一件吧。” 市场二楼有一家专营时尚男装的尾货店,也都不贵,衬衫50元/件,羽绒服也在100元左右,就是样式老了一些。老板苦笑着告诉记者:“我一直是在秀水卖货,金融危机一来,老外都不买了,可那儿的房租交不起呀,所以上这儿另辟蹊径了。”记者发现,最近从秀水搬来的还真不少,店主们说这里开价就比秀水便宜2/3,“这儿的房租多便宜呀,秀水一个月顶这儿一年的。” 不过,除了一些比较好的尾货店外,这儿的大妈级商品也真不少,从毛衣、羽绒衣到围巾、保暖裤,很 多也都叫外贸货,倒也不贵,最便宜的毛衫只要8块钱就能买到。 交通指南: ◎城铁5号线天通苑站下;公交车851,966,985等很多车能到,在东三旗南站下车;如果是开车,市场门口有很多停车位,不用担心停车问题。 通州AND淘宝城 ?码头三:通州AND淘宝城 综合评价:CBD白领淘宝的后花园,同步卖货,性价比称赞。 营业时间:10:00-18:00 咨询电话:81528227 淘宝大坠落汇报: 通州尾货市场位于地铁梨园站南,经营面积约1.3万平方米,共有五层,营业时间每天上午10时到晚7时。 市场总策划梁吉良先生说,与之前策划并营业的天通苑和回龙观的尾货市场不同,通州店是京城的首家“尾货工厂店”,除了商品种类更多外,价格更是低至2折。通州尾货市场是2008年4月份开业,市场开张不久,就挺有口碑,尤其是那些喜欢欧洲款式的女孩子。这里有专营ONLY和VERO MODA的尾货店,而且进货频繁,基本上赶上同步售卖了。记者去的时候,很多女孩子都在选货,断码断号的裤子一般80元左右,同步在商场售卖的裤子一般 100,150元。一件ONLY的羽绒服开价180元,如果真要购买,还有“商量余地”。 记者选了半天,没有挑到合适的衣服,店主笑着说,“没事,慢慢选,要是不满意过两天再来,我马上又要进货了。” “这次进什么,”记者问,“看厂家的吧,最近货比较多,再来的也不会贵。”店主边整理货摊边说。 除了品牌尾货,这里还有很多厂家直销店。记者对比了一下价格,就拿今年最流行的雪地靴比价,一双雪地靴在百荣世贸服装市场开价是180元,最低可以讨到70元,但是在这里的开价就是55元。餐桌上的外贸绣花椅垫,东四十条外贸一条街一个最低25元,这里开口15元。同等商品比价,通州尾货市场在价格上绝对有优势。难怪一个淘宝客对记者说:“我几乎隔周就去一次,买一大推回来,最便宜的吊带衣3块钱一个,我自己穿一部分,其余的拿到我的淘宝店里卖了,特别划算。” 交通指南: ◎地铁八通线梨园站下即到。 天汇尾货商城 ?码头四:天汇尾货商城 综合评价:品牌“组团”下嫁,尾货变成专卖。“让昂贵见鬼去吧”就是指这儿 营业时间:9:00-18:00 咨询电话:63393499 淘宝大坠落汇报: 2009年1月8日开业,就开在天兰天尾货市场向北200米的位置。和现有的其它尾货市场不同,天汇尾货市场从试营业第一天起就有国内外知名品牌 “撑腰”,鳄鱼、红蜻蜓、花花公子、老人头目前都已入驻。记者了解到,从2009年1月15日正式营业后,李宁、佐丹奴、恒源祥等品牌也都陆续加入。 有业内人士说,如此多的品牌大规模占领尾货市场,也许未来的尾货商城都将偏向于 “低于燕莎奥特莱斯,高于一般尾货市场”的定位。 交通指南: ◎坐323、349、395、719等公交车在丽泽桥下车,天兰天尾货市场往北200米。 ?码头五:回龙尾货社区淘宝城 综合评价:因为开在社区,所以少了许多大牌的存在,但品质和价格是绝对吸引人的。目前已有三家连锁店。回龙观、昌平、良乡。 营业时间:10:00-18:00 咨询电话:81736311 淘宝大坠落汇报: “回龙观”的大牌尾货实在不多,倒是有一些比较便宜的外贸商品。记者发现一件质地不错的帽衫,40元;旁边一个客人买了3条牛仔裤,70 元;记者的朋友拿着5块钱的一个小衫偷偷告诉记者:“一样的东西,在地安门的外贸小店张嘴就卖70元,还不准砍价。” 毛衣最便宜有5元/件的,样式很老,估计只有附近的大妈会停下来驻足。和其它尾货市场相比,这里年轻淘宝客不多,也许因为看上去商品普遍过时,所以更多人宁愿多坐4站地铁去五道口淘时尚,贵也忍了。 如果想买居家服的朋友,顺道的话可以来逛逛,外贸居家裤25元/条,有一家卖睡衣的商铺,质地样式都还不错,30元左右的价格也算便宜。 交通指南: ◎坐13号城铁回龙观站下,在回龙观西大街港龙商业中心里。 木樨园品牌尾货鞋城 ?码头六:天兰尾货——木樨园品牌尾货鞋城 综合评价:品牌占据了多数,购物环境也比其他尾货市场舒适,大牌也不少,但商场实行统一收银,缺 少了砍价的乐趣~ 营业时间:9:00-20:00 咨询电话:67284698 尾货鞋城 淘宝大坠落汇报: 该鞋城位于木樨园桥西南角方仕商贸城的三层,面积约4500平米,主要经营品牌尾货男女皮鞋、商场下架鞋、新款低价女款时尚鞋、运动休闲鞋、童鞋等。皮鞋的价格也是低的诱人,商家打出了“就是便宜” 的宣传,并称所售皮鞋大部分低于成本价60%,同品牌的尾货鞋价格比同类鞋城低30%,比大商场低60%,名牌尾货男女鞋价位为每双60-150元,保证所售产品为真皮。一双款式不错的金利来牌男款皮鞋标价仅100元,宾度女鞋仅售60元,与大商场的原价488元相比确实省了不少。据商场负责人介绍,这么便宜的鞋包含很多知名品牌,像“李宁”、 “宾度”、“骆驼”、 “特步”、“康奈” “都彭”、“花花公子”等大牌鞋在这儿都能找到,虽然有的牌子款式稍稍落伍(其实新、老款样式很相近),或是断码,但是价格超便宜,这些皮鞋80%以上都是鞋城直接从鞋厂收购过来的尾货或库存,质量还是有保障的。 交通指南: ◎木樨园桥西南角方仕国际商贸城。 东四十条外贸一条街 ?码头八:东四十条外贸一条街 综合评价:白领最爱逛,风格偏时尚。在东四十条街的南北两侧,遍布着近百小店,名字多冠以“外贸”二字。 营业时间:7:00-20:00 咨询电话: 淘宝大坠落汇报: 这里的每家店都各自成家,占地十余平方米。这里的商品多是帮厂家带卖一些剩货,或者从市场批发来的衣服便宜卖,店内也有E.LAND等知名品牌,店主说这样的货物不多,都是厂家的“外单”,所以卖得很便宜。 毛衣单价15元、女裤单价35元……这里的衣服并不太贵。 交通指南: ◎乘公交115、113、406、701、117、416路三里屯站下,乘110、120、403、118工人体育场站下,或乘地铁东四十条站下 “火眼金睛”识原单尾货 巧人过“五招” 看了前面的文章,你可能正在心痒尾货商品的性价比,却犹豫不知如何在成堆尾货中淘到真正的“原单”。 别犹豫了,记者在对这8家尾货市场的采访中,和商家学习了诸多火眼金睛淘尾货的技巧,只要记住一些原单特征,保证像个内行人一样“火眼金睛”。 ◎第一招:瑕疵旁边有小红箭头 一般来说,在国内加工的成品运到国外后,要先被老外验货,质检员挑出有问题的衣服,在瑕疵旁贴一个小红箭头,打包“遣送回国”。这样的外贸退货虽然有瑕疵,但用的是最优质的面料、配料。 ◎第二招:严格审查纽扣和拉链 鉴别大品牌商品是否是“原单”,五金件最重要。五金件主要指的就是拉链、纽扣,是否配套,是否拉得顺滑,很多纽扣上都拓着大牌商标,一定要看仔细。 ◎第三招:寻找备用扣,备用线 很多正品货如ESPRIT、ochirly都有备用扣或备用线,无论什么款式,衣服还是裤子,会在吊牌处悬挂一个小袋子,放上备用扣子或同色线。 ◎第四招: 水洗标和Sample样标 大牌尾货一般都有水洗标,即使没有也有剪掉的痕迹,如果你在商品中找到Sample字样的样标,说明这件是样品,属于原单尾货贱卖。 ◎第五招:接口处花色一致 原单货的衣服肩膀、袖口、腰身接口处,纹路走向一致,尤其是花朵的每一个花边都嵌的“天衣无缝”。这些小地方,品牌货都会做的非常精细 第5章 字符串 我们一直在使用字符串,C#中string关键字的映射实际上指向.NET 基类System.String。System.String是一个功能非常强大且用途非常广泛的基类,但它不是.NET中唯一与字符串相关的类。其他的用来处理字符串的.NET类还有很多,如System.Text 和 System.Text.Regular Expressions命名空间中的类等等。 一、System.String类 System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作。由于这种数据类型非常重要,C#提供了它自己的关键字和相关的语法,以便于使用这个类来处理字符串。 使用运算符重载可以连接字符串: string message1 = "Hello"; //return "Hello" message1 += ", There"; // return "Hello, There " string message2 = message1 + "!"; // return "Hello, There!" C#还允许使用类似于索引器的语法来提取指定的字符: char char4 = message[4]; // returns 'a'. Note the char is zero-indexed 这个类可以完成许多常见的任务,例如替换字符、删除空白和把字母变成大写形式等。可用的方法如所示。 方 法 作 用 Compare 比较字符串的内容,考虑文化背景(区域),确定某些字符是否相等 CompareOrdinal 与Compare一样,但不考虑文化背景 把多个字符串实例合并为一个实例 Concat 把特定数量的字符从选定的下标复制到数组的一个全新实例中 CopyTo 格式化包含各种值的字符串和如何格式化每个值的说明符 Format 定位字符串中第一次出现某个给定子字符串或字符的位置 IndexOf 定位字符串中第一次出现某个字符或一组字符的位置 IndexOfAny 把一个字符串实例插入到另一个字符串实例的指定索引处 Insert 合并字符串数组,建立一个新字符串 Join LastIndexOf 与IndexOf一样,但定位最后一次出现的位置 LastIndexOfAny 与IndexOfAny,但定位最后一次出现的位置 在字符串的开头,通过添加指定的重复字符填充字符串 PadLeft 在字符串的结尾,通过添加指定的重复字符填充字符串 PadRight 用另一个字符或子字符串替换字符串中给定的字符或子字符串 Replace 在出现给定字符的地方,把字符串拆分为一个子字符串数组 Split 在字符串中获取给定位置的子字符串 Substring 把字符串转换为小写形式 ToLower 把字符串转换为大写形式 ToUpper 删除首尾的空白 Trim 注意:这个表并不完整,但可以让您明白字符串所提供的功能。 1、创建字符串 如上所述,string类是一个功能非常强大的类,它执行许多很有用的方法。但是,string类存在一个问题:重复修改给定的字符串,效率会很低,它实际上是一个不可变的数据类型,一旦对字符串对象进行了初始化,该字符串对象就不能改变了。表面上修改字符串内容的方法和运算符实际上是创建一个新的字符串,如果必要,可以把旧字符串的内容复制到新字符串中。例如,下面的代码: string greetingText = "Hello from all the guys at Wrox Press. "; greetingText += "We do hope you enjoy this book as much as we enjoyed writing it."; 在执行这段代码时,首先,创建一个System.String类型的对象,并初始化为文本“Hello from all the guys at Wrox Press. ”。注意句号后面有一个空格。此时.NET 运行库会为该字符串分配足够的内存来保存这个文 本(39个字符),再设置变量greetingText,表示这个字符串实例。 从语法上看,下一行代码是把更多的文本添加到字符串中。实际上并非如此,而是创建一个新字符串 实例,给它分配足够的内存,以保存合并起来的文本(共103个字符)。最初的文本“Hello from all the people at Wrox Press.”复制到这个新字符串中,再加上额外的文本“We do hope you enjoy this book as much as we enjoyed writing it.”。然后更新存储在变量greetingText中的地址,使变量正确地指向新的字符串对象。旧的 字符串对象被撤销了引用—— 不再有变量引用它,下一次垃圾收集器清理应用程序中所有未使用的对象 时,就会删除它。 这本身还不坏,但假定要对这个字符串加密,在字母表中,用ASCII码中的字符替代其中的每个字母(标 点符号除外),作为非常简单的加密模式的一部分,就会把该字符串变成“Ifmmp gspn bmm uif hvst bu Xspy Qsftt. Xf ep ipqf zpv fokpz uijt cppl bt nvdi bt xf fokpzfe xsjujoh ju.”。完成这个任务有好几种方式,但最简单、 最高效的一种(假定只使用String类)是使用String. Replace()方法,把字符串中指定的子字符串用另一个子 字符串代替。使用Replace(),加密文本的代码如下所示: string greetingText = "Hello from all the guys at Wrox Press. "; greetingText += "We do hope you enjoy this book as much as we enjoyed writing it."; for(int i = 'z'; i>='a' ; i--) { char old1 = (char)i; char new1 = (char)(i+1); greetingText = greetingText.Replace(old1, new1); } for(int i = 'Z'; i>='A' ; i--) { char old1 = (char)i; char new1 = (char)(i+1); greetingText = greetingText.Replace(old1, new1); } Console.WriteLine("Encoded:\n" + greetingText); 注意: Replace()以一种智能化的方式工作,在某种程度上,它并没有创建一个新字符串,除非要对旧字符串 进行某些改变。原来的字符串包含23个不同的小写字母,和3个不同的大写字母。所以Replace()就分配一 个新字符串,共26次,每个新字符串都包含103个字符。因此加密过程需要在堆上有一个能存储总共2678 个字符的字符串对象,最终将等待被垃圾收集~显然,如果使用字符串进行文字处理,应用程序就会有严 重的性能问题。 为了解决这个问题,Microsoft提供了System.Text.StringBuilder类。StringBuilder不像String那样支持 非常多的方法。在StringBuilder上可以进行的处理仅限于替换和添加或删除字符串中的文本。但是,它的 工作方式非常高效。 在使用String类构造一个字符串时,要给它分配足够的内存来保存字符串,但StringBuilder通常分配 的内存会比需要的更多。开发人员可以选择显式指定StringBuilder要分配多少内存,但如果没有显式指定, 存储单元量在默认情况下就根据StringBuilder初始化时的字符串长度来确定。它有两个主要的属性: ? Length指定字符串的实际长度; ? Capacity是字符串占据存储单元的最大长度。 对字符串的修改就在赋予StringBuilder实例的存储单元中进行,这就大大提高了添加子字符串和替换单个字符的效率。删除或插入子字符串仍然效率低下,因为这需要移动随后的字符串。只有执行扩展字符串容量的操作,才需要给字符串分配新内存,才可能移动包含的整个字符串。在添加额外的容量时,从经验来看,StringBuilder如果检测到容量超出,且容量没有设置新值,就会使自己的容量翻倍。 例如,如果使用StringBuilder对象构造最初的欢迎字符串,可以编写下面的代码: StringBuilder greetingBuilder = new StringBuilder("Hello from all the guys at Wrox Press. ", 150); greetingBuilder.AppendFormat("We do hope you enjoy this book as much as we enjoyed writing it"); 注意: 为了使用StringBuilder类,需要在代码中引用System.Text。 在这段代码中,为StringBuilder设置的初始容量是150。最好把容量设置为字符串可能的最大长度,确保StringBuilder不需要重新分配内存,因为其容量足够用了。理论上,可以设置尽可能大的数字,足够给该容量传送一个int,但如果实际上给字符串分配20亿个字符的空间(这是StringBuilder实例允许拥有的最大理论空间),系统就可能会没有足够的内存。 在调用Append()方法时,其他文本就放在空的空间中,不需要分配更多的内存。但是,多次替换文本才能获得使用StringBuilder所带来的性能提高。例如,如果要以前面的方式加密文本,就可以执行整个加密过程,无须分配更多的内存: StringBuilder greetingBuilder = new StringBuilder("Hello from all the guys at Wrox Press. ", 150); greetingBuilder.Append("We do hope you enjoy this book as much as we " + "enjoyed writing it"); Console.WriteLine("Not Encoded:\n" + greetingBuilder); for(int i = 'z'; i>='a' ; i--) { char old1 = (char)i; char new1 = (char)(i+1); greetingBuilder = greetingBuilder.Replace(old1, new1); } for(int i = 'Z'; i>='A' ; i–– ) { char old1 = (char)i; char new1 = (char)(i+1); greetingBuilder = greetingBuilder.Replace(old1, new1); } Console.WriteLine("Encoded:\n" + greetingBuilder); 这段代码使用了StringBuilder.Replace()方法,它的功能与String.Replace()一样,但不需要在过程中复制字符串。在上述代码中,为存储字符串而分配的总存储单元是150个字符,用于StringBuilder实例以及在最后一个Console.WriteLine()语句中执行字符串操作期间分配的内存。 一般,使用StringBuilder可以执行字符串的操作,String可以存储字符串或显示最终结果。 2 StringBuilder成员 前面介绍了StringBuilder的一个构造函数,它的参数是一个初始字符串及该字符串的容量。还有几个其他的StringBuilder构造函数,例如,可以只提供一个字符串: StringBuilder sb = new StringBuilder("Hello"); 或者用给定的容量创建一个空的StringBuilder: StringBuilder sb = new StringBuilder(20); 除了前面介绍的Length 和 Capacity属性外,还有一个只读属性MaxCapacity,它表示对给定的StringBuilder实例的容量限制。在默认情况下,这由int.MaxValue给定(大约20亿,如前所述)。但在构造StringBuilder对象时,也可以把这个值设置为较低的值: // This will both set initial capacity to 100, but the max will be 500. // Hence, this StringBuilder can never grow to more than 500 characters, // otherwise it will raise exception if you try to do that. StringBuilder sb = new StringBuilder(100, 500); 还可以随时显式地设置容量,但如果把这个值设置为低于字符串的当前长度,或者超出了最大容量,就会抛出一个异常: StringBuilder sb = new StringBuilder("Hello"); sb.Capacity = 100; 主要的StringBuilder方法如表所示。 名 称 作 用 给当前字符串添加一个字符串 Append() 添加特定格式的字符串 AppendFormat() 在当前字符串中插入一个子字符串 Insert() 从当前字符串中删除字符 Remove() 在当前字符串中,用某个字符替换另一个字符,或者用当前字符串中Replace() 的一个子字符串替换另一字符串 ToString() 把当前字符串转换为System.String对象(在System.Object中被重写) 其中一些方法还有几种格式的重载方法。 注意: AppendFormat()实际上会在调用Console.WriteLine()时调用,它负责确定所有像{0:D}的格式化表达式应使用什么表达式替代。下一节讨论这个问题。 不能把StringBuilder转换为String(隐式转换和显式转换都不行)。如果要把StringBuilder的内容输出为String,唯一的方式是使用ToString()方法。 前面介绍了StringBuilder类,说明了使用它提高性能的一些方式。注意,这个类并不总能提高性能。StringBuilder类基本上应在处理多个字符串时使用。但如果只是连接两个字符串,使用System.String会比较好。 3、格式化字符串 前面的代码示例中编写了许多类和结构,对这些类和结构执行ToString()方法,都是为了显示给定变量的内容。但是,用户常常希望以各种可能的方式显示变量的内容,在不同的文化或地区背景中有不同的格式。.NET基类System.DateTime就是最明显的一个示例:可以把日期显示为10 June 2008、10 Jun 2008、6/10/08 (美国)、10/6/08 (英国)或10.06.2008 (德国)。 同样,第6章中编写的Vector结构执行Vector.ToString()方法,是为了以(4, 56, 8)格式显示矢量。编写矢量的另一个非常常用的方式是4i + 56j + 8k。如果要使类的用户友好性比较高,就需要使用某些工具以用户希望的方式显示它们的字符串表示。.NET运行库定义了一种标准方式:使用接口IFormattable,本节的主题就是说明如何把这个重要特性添加到类和结构上。 在显示一个变量时,常常需要指定它的格式,此时我们经常调用Console.WriteLine()方法。因此,我们把这个方法作为示例,但这里的讨论适用于格式化字符串的大多数情况。例如,如果要在列表框或文本框中显示一个变量的值,一般要使用String.Format()方法来获得该变量的合适字符串表示,但用于请求所需格 式的格式说明符与传递给Console.WriteLine()的格式相同,因此本节把Console.WriteLine()作为一个示例来说明。首先看看在为基本类型提供格式字符串时会发生什么,再看看如何把自己的类和结构的格式说明符添加到过程中。 以前在Console.Write()和Console.WriteLine()中使用了格式字符串: double d = 13.45; int i = 45; Console.WriteLine("The double is {0,10:E} and the int contains {1}", d, i); 格式字符串本身大都由要显示的文本组成,但只要有要格式化的变量,它在参数列表中的下标就必须放在括号中。在括号中还可以有与该项的格式相关的其他信息,例如可以包含: ? 该项的字符串表示要占用的字符数,这个信息的前面应有一个逗号,负值表示该项应左对齐,正值表示该项应右对齐。如果该项占用的字符数比给定的多,其内容也会完整地显示出来。 ? 格式说明符也可以显示出来。它的前面应有一个冒号,表示应如何格式化该项。例如,把一个数字格式化为货币,或者以科学计数法显示。 数字类型的常见格式说明符: 格 式 应 用 含 义 示 例 符 数字类型 专用场合的货币值 C $4834.50 (USA) ?4834.50 (UK) 只用于整数一般的整数 D 4834 类型 数字类型 科学计数法 E 4.834E+003 数字类型 小数点后的位数固定 F 4384.50 数字类型 一般的数字 G 4384.5 数字类型 通常是专用场合的数字N 4,384.50 (UK/USA) 格式 4 384,50 (欧洲大陆) 数字类型 百分比计数法 P 432,000.00% 只用于整数十六进制格式 X 1120 (如果要显示 类型 0x1120,需要写上0x) 如果要在整数上加上前导0,可以将格式说明符0重复所需的次数。例如,格式说明符0000会把3显示为0003,99显示为0099。 这里不能给出完整的列表,因为其他数据类型有自己的格式说明符。本节的主要目的是说明如何为自己的类定义格式说明符。 1. 字符串的格式化 为了说明如何格式化字符串,看看执行下面的语句会得到什么结果: Console.WriteLine("The double is {0,10:E} and the int contains {1}", d, i); Console.WriteLine()只是把参数的完整列表传送给静态方法String.Format(),如果要在字符串中以其他方式格式化这些值,例如显示在一个文本框中,也可以调用这个方法。带有3个参数的WriteLine()重载方法如下: // Likely implementation of Console.WriteLine() public void WriteLine(string format, object arg0, object arg1) { Console.WriteLine(string.Format(format, arg0, arg1)); } 上面的代码依次调用了带有1个参数的重载方法WriteLine(),仅显示了传递过来的字符串的内容,没 有对它进行进一步的格式化。 String.Format()现在需要用对应对象的合适字符串表示来替换每个格式说明符,构造最终的字符串。但是,如前所述,对于这个建立字符串的过程,需要StringBuilder实例,而不是String实例。在这个示例中,StringBuilder实例是用字符串的第一部分(即文本“The double is”)创建和初始化的。然后调用StringBuilder.AppendFormat()方法,传递第一个格式说明符“{0,10:E}”和相应的对象double,把这个对象的字符串表示添加到构造好的字符串中,这个过程会继续重复调用StringBuilder.Append()和StringBuilder.AppendFormat()方法,直到得到了全部格式化好的字符串为止。 下面的内容比较有趣。StringBuilder.AppendFormat()需要指出如何格式化对象,它首先检查对象,确定它是否执行System命名空间中的接口IFormattable。只要试着把这个对象转换为接口,看看转换是否成功即可,或者使用C#关键字is,也能实现此测试。如果测试失败,AppendFormat()只会调用对象的ToString()方法,所有的对象都从System.Object继承了这个方法或重写了该方法。在前面给出的编写各种类和结构的示例中,执行过程都是这样,因为我们编写的类都没有执行这个接口。这就是在前面的章节中,Object.ToString()的重写方法允许在Console.WriteLine()语句中显示类和结构如Vector的原因。 但是,所有预定义的基本数字类型都执行这个接口,对于这些类型,特别是这个示例中的double和int,就不会调用继承自System.Object的基本ToString()方法。为了理解这个过程,需要了解IFormattable接口。 IFormattable只定义了一个方法,该方法也叫作ToString(),它带有两个参数,这与System. Object版本的ToString()不同,它不带参数。下面是IFormattable的定义: interface IFormattable { string ToString(string format, IFormatProvider formatProvider); } 这个ToString()重载方法的第一个参数是一个字符串,它指定要求的格式。换言之,它是字符串的说明符部分,放在字符串的{}中,该参数最初传递给Console.WriteLine()或String. Format()。例如,在本例中,最初的语句如下: Console.WriteLine("The double is {0,10:E} and the int contains {1}", d, i); 在计算第一个说明符{0,10:E}时,在double变量d上调用这个重载方法,传递给它的第一个参数是E。StringBuilder.AppendFormat()传递的总是显示在原始字符串的合适格式说明符内冒号后面的文本。 本不讨论ToString()的第2个参数,它是执行接口IFormatProvider的对象引用。这个接口提供了ToString()在格式化对象时需要考虑的更多信息—— 一般包括文化背景信息(.NET文化背景类似于Windows时区,如果格式化货币或日期,就需要这些信息)。如果直接从源代码中调用这个ToString()重载方法,就需要提供这样一个对象。但StringBuilder. Append Format()为这个参数传递一个空值。如果formatProvider为空,ToString()就要使用系统设置中指定的文化背景信息。 现在回过头来看看本例。第一个要格式化的项是double,对此要求使用指数计数法,格式说明符为E。如前所述,StringBuilder.AppendFormat()方法会建立执行IFormattable接口的对象double,因此要调用带有两个参数的ToString()重载方法,其第一个参数是字符串“E”,第二个参数为空。现在double的这个方法在执行时,会考虑要求的格式和当前的文化背景,以合适的格式返回double的字符串表示。StringBuilder.AppendFormat()则按照需要在返回的字符串中添加前导空格,使之共有10个字符。 下一个要格式化的对象是int,它不需要任何特殊的格式 (格式说明符是{1})。由于没有格式要求,StringBuilder.AppendFormat()会给该格式字符串传递一个空引用,并适当地响应带有两个参数的int.ToString()重载方法。由于没有特殊的格式要求,所以也可以调用不带参数的ToString()方法。
/
本文档为【【2017年整理】北京外贸原单尾货】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索