ফাইলের আকারকে বাইটে মানব-পঠনযোগ্য স্ট্রিংয়ে রূপান্তর করা


239

আমি এই ফাংশনটি ফাইলের আকারকে বাইটে একটি মানব-পঠনযোগ্য ফাইল আকারে রূপান্তর করতে ব্যবহার করছি:

function getReadableFileSizeString(fileSizeInBytes) {
    var i = -1;
    var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
    do {
        fileSizeInBytes = fileSizeInBytes / 1024;
        i++;
    } while (fileSizeInBytes > 1024);

    return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
};

তবে এটি মনে হয় এটি 100% সঠিক নয়। উদাহরণ স্বরূপ:

getReadableFileSizeString(1551859712); // output is "1.4 GB"

এই হওয়া উচিত নয় "1.5 GB"? দেখে মনে হচ্ছে যে 1024 দ্বারা বিভাগ নির্ভুলতা হারাচ্ছে। আমি কি কোনও কিছুকে পুরোপুরি ভুল বুঝছি বা এটি করার আরও ভাল উপায় আছে?


3
getReadableFileSizeString (0); 0.1kb; পি ফেরান
ড্যানিয়েল ম্যাগনসন

2
কেন এটি 1.5? এটি 1.445281982421875যা সঠিকভাবে 1.4 এর নিচে যায়।
এমপেন

1
1551859712 / (1024 ^ 3) = 1.445281982421875 যা সঠিক!
এইচএম

2
আমি আপনাকে যোগ করেছি যে ভালবাসা YB। সন্দেহজনক যে কেউ তার ডিবির জন্য এমনকি 1 ওয়াইবি পাবে। এটির জন্য 100 ট্রিলিয়ন ডলার ব্যয় হবে !
গেয়ারাড

4
@ গুয়ারাড - ৫০ বছর আগে থেকে একটি 5 এমবি হার্ড ড্রাইভের বিখ্যাত চিত্র রয়েছে (একটি রুমের আকারে ছিল এবং ওজন প্রায় এক টন ছিল)। আমি নিশ্চিত ফিরে এসেছি তারা তখনও জিবি এবং টিবি সম্পর্কে স্বপ্ন দেখেনি, এবং আমরা আজ কোথায় আছি তা দেখুন ... কখনও বলবেন না ;-)
TheCuBeMan

উত্তর:


45

এটি আপনি বাইনারি বা দশমিক কনভেনশন ব্যবহার করতে চান কিনা তার উপর নির্ভর করে।

উদাহরণস্বরূপ, র‌্যামটি সর্বদা বাইনারিতে পরিমাপ করা হয়, সুতরাং 1551859712 হিসাবে ~ 1.4GiB হিসাবে প্রকাশ করা সঠিক হবে।

অন্যদিকে, হার্ড ডিস্ক নির্মাতারা দশমিক ব্যবহার করতে পছন্দ করেন, তাই তারা এটিকে ~ 1.6GB বলে।

এবং কেবল বিভ্রান্ত হওয়ার জন্য, ফ্লপি ডিস্ক দুটি সিস্টেমের মিশ্রণ ব্যবহার করে - তাদের 1 এমবি আসলে 1024000 বাইট।


3
সাপার মজার ;-) "কেবল বিভ্রান্ত হওয়ার জন্য, ফ্লপি ডিস্ক দুটি সিস্টেমের মিশ্রণ ব্যবহার করে - তাদের 1 এমবি আসলে 1024000 বাইট।"
ফ্রানএক্সহো 3'18

সত্য, র‌্যামের মাপগুলি আইইসি ইউনিটগুলি ব্যবহার করে, মেট্রিক ব্যবহার করে ডিস্ক আকার মাপানো হয় .. উভয়কে রূপান্তর করার জন্য একটি আইসোমর্ফিক এনপিএম মডিউল রয়েছে: বাইট-সাইজ
লয়েড

351

আমি এখানে একটি লিখেছি:

function humanFileSize(bytes, si=false, dp=1) {
  const thresh = si ? 1000 : 1024;

  if (Math.abs(bytes) < thresh) {
    return bytes + ' B';
  }

  const units = si 
    ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 
    : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
  let u = -1;
  const r = 10**dp;

  do {
    bytes /= thresh;
    ++u;
  } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);


  return bytes.toFixed(dp) + ' ' + units[u];
}


console.log(humanFileSize(5000, true))  // 5.0 kB
console.log(humanFileSize(5000, false))  // 4.9 KiB
console.log(humanFileSize(-10000000000000000000000000000))  // -8271.8 YiB
console.log(humanFileSize(999949, true))  // 999.9 kB
console.log(humanFileSize(999950, true))  // 1.0 MB
console.log(humanFileSize(999950, true, 2))  // 999.95 kB
console.log(humanFileSize(999500, true, 0))  // 1 MB


1
আমি একটি সমন্বয় করছি: প্রান্তিকের মূল্যায়ন করার সময়, নিখুঁত মানটি গ্রহণ করুন। এইভাবে ফাংশনটি নেতিবাচক মানগুলিকে সমর্থন করবে। দুর্দান্ত ফাংশন! একটি সুইচ বিবৃতি ব্যবহার না করার জন্য আপনাকে ধন্যবাদ !!
অ্যারন ব্লেনকুশ

20
@ অ্যারোনব্লেনকুশ: আপনার নেতিবাচক ফাইলের আকার কখন থাকবে?
এমপেন

14
আমি আপনার ফাংশনটি কেবলমাত্র একটি Google শীটে অনুলিপি করে দিয়েছি "ক্লিনআপ" অপারেশনের পরে সাইজ ডেল্টা দেখানোর জন্য। এর আগে, পরে এবং ডিফ ক্লিনআপ অপারেশনের ফলে কিছু ডাটাবেস টেবিল বৃদ্ধি পেয়েছে এবং অন্যগুলিতে হ্রাস পেয়েছে। উদাহরণস্বরূপ, টেবিল এ -1.95 মেগাবাইটের পার্থক্য রয়েছে, অন্যদিকে সারণি বিতে 500 কেবি এর পার্থক্য রয়েছে। অতএব: ইতিবাচক এবং নেতিবাচক :-)
অ্যারন ব্লেনকুশ

এখানে স্ক্রিপ্টটির সংকোচিত সংস্করণটি রয়েছে:function humanFileSize(B,i){var e=i?1e3:1024;if(Math.abs(B)<e)return B+" B";var a=i?["kB","MB","GB","TB","PB","EB","ZB","YB"]:["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],t=-1;do B/=e,++t;while(Math.abs(B)>=e&&t<a.length-1);return B.toFixed(1)+" "+a[t]}
রেন্ডারস00

1
@ রেন্ডারস00: সংক্ষিপ্ত সংস্করণটির জন্য ধন্যবাদ। তুমি কি আমাকে যদিও বলতে পারবেন, কেন তুমি পর দুই অদৃশ্য ইউনিকোড অক্ষর U + এ 200C (শূন্য প্রস্থ নন-যোজক) এবং ইউ + + 200B (শূন্য প্রস্থের স্পেস) সন্নিবেশিত অনেকবার EIB ? এটি কি ওয়াটারমার্ক হওয়ার উদ্দেশ্যে, যাতে আপনি এই কোডটি ব্যবহার করেছেন তা ট্র্যাক করতে পারে? যদি তা হয় তবে আমি মনে করি আপনার পোস্টে স্বচ্ছ হওয়া উচিত ছিল।
লিবিয়াথন

81

গণনার আর একটি প্রতিমূর্তি

function humanFileSize(size) {
    var i = Math.floor( Math.log(size) / Math.log(1024) );
    return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
};

8
দেখে মনে হচ্ছে 0
অফির্মো

4
এটি 0 বা পরিচালনা করে না? সর্বোপরি, এটির সাথে যদি (আকার == 0) {} অন্য {} আমি দেখেছি তার চেয়ে বেশি মার্জিত e
রডরিগো

13
প্রথম লাইনটি পরিবর্তন করে var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );মনে হয় কৌশলটি 0 হলে এটি করা হবে এটি "0 বি" ফিরে আসবে।
গ্যাভিন

শুধু এফওয়াইআই; আমি জানি উত্তরটি সরল জাভাস্ক্রিপ্ট, তবে কেউ যদি টাইপস্ক্রিপ্টে এটি ব্যবহার করতে না চান তবে এটি কাজ করে না (সঠিকভাবে টাইপ করা হয়নি, যেমন আপনি করছেন toFixedএবং তারপরে একটি স্ট্রিং দিয়ে গণিত করছেন What কী করেন * 1?
ফ্রেক্সুজ

1
*1নম্বরে স্ট্রিং থেকে ডাটা টাইপ পরিবর্তন, তাই মান 1024আপনি পেতে 1 kBপরিবর্তে 1.00 kB। আপনি Number((size / Math.pow(1024, i)).toFixed(2))একই জিনিসটি সম্পাদন করে টাইপস্ক্রিপ্টকে খুশি করতে পারেন ।
অ্যাড্রিয়ান টি

38

নতুন আন্তর্জাতিক মানকে সম্মান করে একটি সংখ্যাকে পাঠযোগ্য স্ট্রিংয়ে রূপান্তর করার জন্য এখানে একটি প্রতিবেদন রয়েছে।

বড় সংখ্যক উপস্থাপনের দুটি উপায় রয়েছে: আপনি হয় তাদের 1000 = 10 3 (বেস 10) বা 1024 = 2 10 (বেস 2) এর গুণকগুলিতে প্রদর্শন করতে পারেন। আপনি যদি 1000 দ্বারা বিভাজন করেন, আপনি সম্ভবত এসআই উপসর্গের নামগুলি ব্যবহার করেন, যদি আপনি 1024 দ্বারা ভাগ করেন তবে আপনি সম্ভবত আইসিসি উপসর্গের নামগুলি ব্যবহার করেন। সমস্যাটি 1024 দ্বারা বিভাজন দিয়ে শুরু হয় Many অনেক অ্যাপ্লিকেশন এর জন্য এসআই উপসর্গের নাম ব্যবহার করে এবং কিছু আইইসি উপসর্গের নাম ব্যবহার করে। বর্তমান পরিস্থিতি একটি জগাখিচুড়ি। যদি আপনি এসআই উপসর্গের নামগুলি দেখতে পান তবে আপনি জানেন না যে সংখ্যাটি 1000 বা 1024 দ্বারা বিভক্ত কিনা

https://wiki.ubuntu.com/UnitsPolicy

http://en.wikipedia.org/wiki/Template:Quantities_of_bytes

Object.defineProperty(Number.prototype,'fileSize',{value:function(a,b,c,d){
 return (a=a?[1e3,'k','B']:[1024,'K','iB'],b=Math,c=b.log,
 d=c(this)/c(a[0])|0,this/b.pow(a[0],d)).toFixed(2)
 +' '+(d?(a[1]+'MGTPEZY')[--d]+a[2]:'Bytes');
},writable:false,enumerable:false});

এই ফাংশনটিতে নং রয়েছে loop এবং তাই এটি সম্ভবত অন্যান্য কয়েকটি ফাংশনের চেয়ে দ্রুত।

ব্যবহার:

আইসিসির উপসর্গ

console.log((186457865).fileSize()); // default IEC (power 1024)
//177.82 MiB
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

এসআই উপসর্গ

console.log((186457865).fileSize(1)); //1,true for SI (power 1000)
//186.46 MB 
//kB,MB,GB,TB,PB,EB,ZB,YB

আমি আইসিসিকে ডিফল্ট হিসাবে সেট করেছি কারণ আমি সবসময় একটি ফাইলের আকার গণনা করতে বাইনারি মোড ব্যবহার করি ... 1024 এর শক্তি ব্যবহার করে


যদি আপনি কেবল একটি সংক্ষিপ্ত অনিলিওনার ফাংশনে চান:

এসআই

function fileSizeSI(a,b,c,d,e){
 return (b=Math,c=b.log,d=1e3,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'kMGTPEZY'[--e]+'B':'Bytes')
}
//kB,MB,GB,TB,PB,EB,ZB,YB

আইইসি

function fileSizeIEC(a,b,c,d,e){
 return (b=Math,c=b.log,d=1024,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
}
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

ব্যবহার:

console.log(fileSizeIEC(7412834521));

যদি আপনার কার্যগুলি সম্পর্কে কিছু প্রশ্ন থাকে তবে কেবল জিজ্ঞাসা করুন


খুব সুন্দর কমপ্যাক্ট কোড, আমি ব্যক্তিগতভাবে দশমিক স্থানগুলি নিয়ন্ত্রণের জন্য বেশ কয়েকটি অতিরিক্ত অক্ষর যুক্ত করব
ওড়ওলোফিল

ওহে! আসলে কোডটি হ'ল আমি প্রথমবার এটি কীভাবে লিখেছি jsfiddle। শেষ বছরগুলিতে আমি শর্টহ্যান্ড এবং বিটওয়াইজ ব্যবহার করতে শিখেছি। ধীরে ধীরে মোবাইল ডিভাইস, ধীরে ধীরে ইন্টারনেট, খুব বেশি জায়গা নেই ... এমন করে আমি অনেক সময় সাশ্রয় করেছি। তবে এটি মোটেও নয়, সামগ্রিক পারফরম্যান্স প্রতিটি ব্রাউজারে তীব্রভাবে বৃদ্ধি পেয়েছে এবং পুরো কোডটি আরও দ্রুত লোড হয় ... আমি jquery ব্যবহার করি না তাই আমাকে প্রতিবার 100kb লোড করতে হবে না। আমার এও বলতে হবে যে আমি মাইক্রোকন্ট্রোলার, স্মার্ট টিভি, গেম কনসোলগুলিতে জাভাস্ক্রিপ্ট লিখি। যাদের সীমিত জায়গা (এমসিইউ এর), পারফরম্যান্স (স্মার্টটিভির) এবং স্বাভাবিকভাবে কখনও কখনও ধীর সংযোগ (মোবাইল) থাকে
কোকো

বলেছিলেন যে আমি আশা করি আপনি আমার পছন্দটি বুঝতে পেরেছেন। আমি যা করতে পারি তা হ'ল আপনি যা বুঝতে পারছেন না বা অন্যদিকে আমি নতুন জিনিস শিখতে খুশি। আমার কোডে যদি এমন কিছু থাকে যা পারফরম্যান্স বাড়িয়ে দিতে পারে বা স্থান বাঁচাতে পারে তবে আমি তা শুনে খুশি।
কোকো

18
মিনিফিকেশনটি আপনার কোডিং শৈলীর নয়, আপনার বিল্ড প্রক্রিয়ার অংশ হওয়া উচিত। কোনও গুরুতর বিকাশকারী এই কোডটি ব্যবহার করবে না কারণ এটি পড়তে এবং সঠিকতা যাচাই করতে খুব বেশি সময় লাগে।
হাইয়েস্ট্রুউ

1
যারা "15.00 বাইটস" দেখতে ঘৃণা করেন তাদের জন্য আপনি এই অংশটি কিছুটা পরিবর্তন করতে পারেন:.toFixed(e ? 2 : 0)
লুকমান

20
sizeOf = function (bytes) {
  if (bytes == 0) { return "0.00 B"; }
  var e = Math.floor(Math.log(bytes) / Math.log(1024));
  return (bytes/Math.pow(1024, e)).toFixed(2)+' '+' KMGTP'.charAt(e)+'B';
}

sizeof (2054110009);
// => "1.91 জিবি"

sizeof (7054110);
// => "6.73 এমবি"

সাইজঅফ ((3 * 1024 * 1024));
// => "৩.০০ এমবি"


2
আপনি বাইট জন্য অতিরিক্ত স্থান পরিত্রাণ পেতে চান, তাহলে আপনি শূন্য প্রস্থের স্পেস ব্যবহার করতে পারে \u200b: '\u200bKMGTP'
সিডিএমকেই

15

ReactJS উপাদান হিসাবে সমাধান

Bytes = React.createClass({
    formatBytes() {
        var i = Math.floor(Math.log(this.props.bytes) / Math.log(1024));
        return !this.props.bytes && '0 Bytes' || (this.props.bytes / Math.pow(1024, i)).toFixed(2) + " " + ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i]
    },
    render () {
        return (
            <span>{ this.formatBytes() }</span>
        );
    }
});

আপডেট করুন এসি 6 ব্যবহারকারীদের জন্য এখানে এই একই উপাদানটির একটি রাষ্ট্রবিহীন সংস্করণ

const sufixes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const getBytes = (bytes) => {
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
  return !bytes && '0 Bytes' || (bytes / Math.pow(1024, i)).toFixed(2) + " " + sufixes[i];
};

const Bytes = ({ bytes }) => (<span>{ getBytes(bytes) }</span>);

Bytes.propTypes = {
  bytes: React.PropTypes.number,
};

1
দুর্দান্ত, ধন্যবাদ গেটবাইটস ফাংশনের প্রথম লাইনে আপনি ম্যাথ.লগ () এর ভিতরে "বাইটস" ভুলে গেছেন
ব্যাপটওয়েস

খুব সুন্দর. অসম্পূর্ণতার জন্য, এবং ES6 স্বরলিপি সহ, আপনি এটি ব্যবহার করতে পারেন: রিটার্ন (! বাইটস এবং & '0 বাইটস') || ${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]};
লিটল ব্রেন

12

কোকোর ধারণার ভিত্তিতে , এখানে কম কমপ্যাক্ট রয়েছে - তবে আশা করা যায় আরও বিস্তৃত উদাহরণ।

<!DOCTYPE html>
<html>
<head>
<title>File info</title>

<script>
<!--
function fileSize(bytes) {
    var exp = Math.log(bytes) / Math.log(1024) | 0;
    var result = (bytes / Math.pow(1024, exp)).toFixed(2);

    return result + ' ' + (exp == 0 ? 'bytes': 'KMGTPEZY'[exp - 1] + 'B');
}

function info(input) {
    input.nextElementSibling.textContent = fileSize(input.files[0].size);
} 
-->
</script>
</head>

<body>
<label for="upload-file"> File: </label>
<input id="upload-file" type="file" onchange="info(this)">
<div></div>
</body>
</html> 

8

আমি "ফাইল ম্যানেজার" আচরণটি (উদাহরণস্বরূপ, উইন্ডোজ এক্সপ্লোরার) চেয়েছিলাম যেখানে দশমিক জায়গাগুলির সংখ্যা সংখ্যার আকারের সাথে আনুপাতিক। আপাতদৃষ্টিতে অন্য উত্তরগুলির কোনওটি এটি করে না।

function humanFileSize(size) {
    if (size < 1024) return size + ' B'
    let i = Math.floor(Math.log(size) / Math.log(1024))
    let num = (size / Math.pow(1024, i))
    let round = Math.round(num)
    num = round < 10 ? num.toFixed(2) : round < 100 ? num.toFixed(1) : round
    return `${num} ${'KMGTPEZY'[i-1]}B`
}

এখানে কয়েকটি উদাহরণ:

humanFileSize(0)          // "0 B"
humanFileSize(1023)       // "1023 B"
humanFileSize(1024)       // "1.00 KB"
humanFileSize(10240)      // "10.0 KB"
humanFileSize(102400)     // "100 KB"
humanFileSize(1024000)    // "1000 KB"
humanFileSize(12345678)   // "11.8 MB"
humanFileSize(1234567890) // "1.15 GB"

ফিক্সড ব্যবহার করে এটি একটি স্ট্রিংয়ে রূপান্তর করে, তাই আপনার বৃত্তাকার হয় স্ট্রিং বা একটি সংখ্যা is এটি খারাপ অভ্যাস, আপনি সহজেই এটিকে কোনও সংখ্যায় ফিরিয়ে আনতে পারেন:+num.tofixed(2)
ভিনসেন্ট ডুপ্রেজ

না .toPrecision(3)এই সব ক্ষেত্রে আবরণ না? ওহ .. আমার ধারণা এটি 1000 এবং 1023 এর মধ্যে coverাকা দেবে না B
এমপেন

7

এখানে অন্যদের অনুরূপ অন্য একটি উদাহরণ

function fileSize(b) {
    var u = 0, s=1024;
    while (b >= s || -b >= s) {
        b /= s;
        u++;
    }
    return (u ? b.toFixed(1) + ' ' : b) + ' KMGTPEZY'[u] + 'B';
}

এটি অনুরূপ বৈশিষ্ট্যযুক্ত অন্যদের তুলনায় नगনযোগ্যভাবে উন্নত পারফরম্যান্সকে পরিমাপ করে।


এটি অন্যান্য উত্তরগুলির চেয়ে ভাল পারফরম্যান্স সরবরাহ করে। আমি এটি ব্যবহার করছি। আমি পর্যায়ক্রমিক গণনা করছিলাম বলে অন্য কয়েকজন আমার ক্রোম ট্যাবগুলিকে ঝুলিয়ে 99.9% সিপিইউ নিয়েছে।
নির লঙ্কা

5

এখানে আমার - সত্যিই বড় ফাইলগুলির জন্যও কাজ করে -_-

function formatFileSize(size)
{
    var sizes = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'];
    for (var i = 1; i < sizes.length; i++)
    {
        if (size < Math.pow(1024, i)) return (Math.round((size/Math.pow(1024, i-1))*100)/100) + sizes[i-1];
    }
    return size;
}

এটি উভয় লুপিং এবং এক্সপেনসিয়েশনের ব্যবহারের পারফরম্যান্স হিটকে একত্রিত করে, যদিও এটি পড়ার পক্ষে বেশ শক্ত। আমি সত্যিই বিন্দু দেখতে পাচ্ছি না।
বর্ণা

2
এটি ব্যবহার করবেন না। এটি কেবল ক্লায়েন্টাইড সিপিইউ থ্যাটস ব্যবহৃত হয়েছে যাতে কে যত্ন করে;)
পঞ্চাশ

2
@ ফিফাই ওয়েল, ক্লায়েন্ট সিপিইউ খুব মূল্যবান, বিশেষত মোবাইলে এবং জটিল অ্যাপ্লিকেশন সহ। :)
রাইতো

5

কোকো এর উত্তরের ভিত্তিতে কিন্তু সামান্য বিস্মৃত হওয়া (সত্য কথা, আমি যেগুলির সাথে স্বাচ্ছন্দ্য বোধ করছিলাম সেগুলি রয়ে গেছে / যুক্ত করা হয়েছে) এবং অনুসরণীয় শূন্যগুলি দেখায় না তবে এখনও 0 সমর্থন করে, অন্যের পক্ষে দরকারী বলে আশা করি:

function fileSizeSI(size) {
    var e = (Math.log(size) / Math.log(1e3)) | 0;
    return +(size / Math.pow(1e3, e)).toFixed(2) + ' ' + ('kMGTPEZY'[e - 1] || '') + 'B';
}


// test:
document.write([0, 23, 4322, 324232132, 22e9, 64.22e12, 76.22e15, 64.66e18, 77.11e21, 22e24].map(fileSizeSI).join('<br>'));


4
1551859712 / 1024 = 1515488
1515488 / 1024 = 1479.96875
1479.96875 / 1024 = 1.44528198242188

আপনার সমাধানটি সঠিক। উপলব্ধি করা গুরুত্বপূর্ণ বিষয় অর্ডার থেকে পেতে যে 1551859712করতে 1.5, আপনি 1000 দ্বারা বিভাজন যা করতে হবে, কিন্তু বাইট 1024 এর বাইনারি টু দশমিক অংশ গণনা করা হয়, অত কেন গিগাবাইট মান কম।


@ এলি ... হ্যাঁ, মনে হচ্ছে এটির মতো। আমার ধারণা 15151859712 এর পরে আমি "1.5" প্রত্যাশা করছিলাম তবে এর অর্থ আমি দশমিকের মধ্যে বাইনারি নই।
হিস্টো

3

আমি @ কোকোর উত্তর আকর্ষণীয় পেয়েছি তবে এর সাথে নিম্নলিখিত বিষয়গুলি ছিল:

  1. নেটিভ প্রকার বা প্রকারের নিজস্ব নয় এমন সংশোধন করবেন না
  2. মানুষের জন্য পরিষ্কার, পঠনযোগ্য কোড লিখুন, মিনিফায়ারগুলি মেশিনগুলির জন্য কোডটি সর্বোত্তম করুন
  3. (টাইপস্ক্রিপ্ট ব্যবহারকারীদের জন্য বোনাস) টাইপস্ক্রিপ্টের সাথে ভাল খেলেন না

টাইপ করা বিষয়:

 /**
 * Describes manner by which a quantity of bytes will be formatted.
 */
enum ByteFormat {
  /**
   * Use Base 10 (1 kB = 1000 bytes). Recommended for sizes of files on disk, disk sizes, bandwidth.
   */
  SI = 0,
  /**
   * Use Base 2 (1 KiB = 1024 bytes). Recommended for RAM size, size of files on disk.
   */
  IEC = 1
}

/**
 * Returns a human-readable representation of a quantity of bytes in the most reasonable unit of magnitude.
 * @example
 * formatBytes(0) // returns "0 bytes"
 * formatBytes(1) // returns "1 byte"
 * formatBytes(1024, ByteFormat.IEC) // returns "1 KiB"
 * formatBytes(1024, ByteFormat.SI) // returns "1.02 kB"
 * @param size The size in bytes.
 * @param format Format using SI (Base 10) or IEC (Base 2). Defaults to SI.
 * @returns A string describing the bytes in the most reasonable unit of magnitude.
 */
function formatBytes(
  value: number,
  format: ByteFormat = ByteFormat.SI
) {
  const [multiple, k, suffix] = (format === ByteFormat.SI
    ? [1000, 'k', 'B']
    : [1024, 'K', 'iB']) as [number, string, string]
  // tslint:disable-next-line: no-bitwise
  const exp = (Math.log(value) / Math.log(multiple)) | 0
  // or, if you'd prefer not to use bitwise expressions or disabling tslint rules, remove the line above and use the following:
  // const exp = value === 0 ? 0 : Math.floor(Math.log(value) / Math.log(multiple)) 
  const size = Number((value / Math.pow(multiple, exp)).toFixed(2))
  return (
    size +
    ' ' +
    (exp 
       ? (k + 'MGTPEZY')[exp - 1] + suffix 
       : 'byte' + (size !== 1 ? 's' : ''))
  )
}

// example
[0, 1, 1024, Math.pow(1024, 2), Math.floor(Math.pow(1024, 2) * 2.34), Math.pow(1024, 3), Math.floor(Math.pow(1024, 3) * 892.2)].forEach(size => {
  console.log('Bytes: ' + size)
  console.log('SI size: ' + formatBytes(size))
  console.log('IEC size: ' + formatBytes(size, 1) + '\n')
});

1

এটি এমপেন উত্তরের আকার উন্নতি

function humanFileSize(bytes, si=false) {
  let u, b=bytes, t= si ? 1000 : 1024;     
  ['', si?'k':'K', ...'MGTPEZY'].find(x=> (u=x, b/=t, b**2<1));
  return `${u ? (t*b).toFixed(1) : bytes} ${u}${!si && u ? 'i':''}B`;    
}


0

যারা ব্যবহার করেন তাদের জন্য Angularএমন একটি প্যাকেজ angular-pipesরয়েছে যা এর জন্য পাইপ রয়েছে:

ফাইল

import { BytesPipe } from 'angular-pipes';

ব্যবহার

{{ 150 | bytes }} <!-- 150 B -->
{{ 1024 | bytes }} <!-- 1 KB -->
{{ 1048576 | bytes }} <!-- 1 MB -->
{{ 1024 | bytes: 0 : 'KB' }} <!-- 1 MB -->
{{ 1073741824 | bytes }} <!-- 1 GB -->
{{ 1099511627776 | bytes }} <!-- 1 TB -->
{{ 1073741824 | bytes : 0 : 'B' : 'MB' }} <!-- 1024 MB -->

দস্তাবেজের সাথে লিঙ্ক


0

আমার উত্তরটি দেরিতে হতে পারে তবে আমার ধারণা এটি কারও পক্ষে সাহায্য করবে।

মেট্রিক উপসর্গ:

/**
 * Format file size in metric prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeMetric = (fileSize) => {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kB', 'MB', 'GB', 'TB'];
  let quotient = Math.floor(Math.log10(size) / 3);
  quotient = quotient < units.length ? quotient : units.length - 1;
  size /= (1000 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};

বাইনারি উপসর্গ:

/**
 * Format file size in binary prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeBinary = (fileSize) => {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kiB', 'MiB', 'GiB', 'TiB'];
  let quotient = Math.floor(Math.log2(size) / 10);
  quotient = quotient < units.length ? quotient : units.length - 1;
  size /= (1024 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};

উদাহরণ:

// Metrics prefix
formatFileSizeMetric(0)      // 0 bytes
formatFileSizeMetric(-1)     // 1 bytes
formatFileSizeMetric(100)    // 100 bytes
formatFileSizeMetric(1000)   // 1 kB
formatFileSizeMetric(10**5)  // 10 kB
formatFileSizeMetric(10**6)  // 1 MB
formatFileSizeMetric(10**9)  // 1GB
formatFileSizeMetric(10**12) // 1 TB
formatFileSizeMetric(10**15) // 1000 TB

// Binary prefix
formatFileSizeBinary(0)     // 0 bytes
formatFileSizeBinary(-1)    // 1 bytes
formatFileSizeBinary(1024)  // 1 kiB
formatFileSizeBinary(2048)  // 2 kiB
formatFileSizeBinary(2**20) // 1 MiB
formatFileSizeBinary(2**30) // 1 GiB
formatFileSizeBinary(2**40) // 1 TiB
formatFileSizeBinary(2**50) // 1024 TiB

-1

বাইটস = 1024 * 10 * 10 * 10;

console.log (getReadableFileSizeString (বাইটস))

1MB এর পরিবর্তে 1000.0Кб ফিরে আসবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.